Keep transcripts with predicted FPKM greater or equal to 1 in either of both conditions (hnRNPL vs. InputKG1a)—furthermore, remove transcripts with a non-positive log of FPKM ratio. Here called L2FC. This is possible are not all transcripts in the list of top genes must be upregulated (L2FC >= 1).
Summary on available regions in top transcripts
Interaction Motifs (no critical Gs)
5.1 Interaction
All (Summary)

All (Detailed)

3-UTR (Summary)

3-UTR (Detailed)

5-UTR (Summary)

5-UTR (Detailed)

CDS (Summary)


CDS (Detailed)

Non Coding RNA


Session Info
R version 4.0.3 (2020-10-10)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 18.04.5 LTS
Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.7.1
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.7.1
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=de_DE.UTF-8 LC_COLLATE=en_US.UTF-8 LC_MONETARY=de_DE.UTF-8 LC_MESSAGES=en_US.UTF-8 LC_PAPER=de_DE.UTF-8 LC_NAME=C LC_ADDRESS=C LC_TELEPHONE=C LC_MEASUREMENT=de_DE.UTF-8
[12] LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] forcats_0.5.0 stringr_1.4.0 dplyr_1.0.2 purrr_0.3.4 readr_1.4.0 tidyr_1.1.2 tibble_3.0.4 tidyverse_1.3.0 genefilter_1.72.0 cowplot_1.1.0 ggseqlogo_0.1 ggplot2_3.3.3 DT_0.16 biomaRt_2.46.0
loaded via a namespace (and not attached):
[1] colorspace_2.0-0 ggsignif_0.6.1 ellipsis_0.3.1 rio_0.5.16 XVector_0.30.0 fs_1.5.0 GenomicRanges_1.42.0 rstudioapi_0.13 ggpubr_0.4.0 farver_2.0.3
[11] ggrepel_0.9.0 bit64_4.0.5 fansi_0.4.1 AnnotationDbi_1.52.0 lubridate_1.7.9.2 xml2_1.3.2 splines_4.0.3 geneplotter_1.68.0 knitr_1.30 jsonlite_1.7.2
[21] broom_0.7.3 annotate_1.68.0 dbplyr_2.0.0 pheatmap_1.0.12 BiocManager_1.30.10 compiler_4.0.3 httr_1.4.2 rvcheck_0.1.8 backports_1.2.1 assertthat_0.2.1
[31] Matrix_1.3-0 cli_2.2.0 htmltools_0.5.0 prettyunits_1.1.1 tools_4.0.3 gtable_0.3.0 glue_1.4.2 GenomeInfoDbData_1.2.4 rappdirs_0.3.1 tinytex_0.28
[41] Rcpp_1.0.5 carData_3.0-4 Biobase_2.50.0 cellranger_1.1.0 vctrs_0.3.6 crosstalk_1.1.0.1 xfun_0.19 rvest_0.3.6 openxlsx_4.2.3 lifecycle_0.2.0
[51] rstatix_0.6.0 XML_3.99-0.5 zlibbioc_1.36.0 scales_1.1.1 hms_0.5.3 MatrixGenerics_1.2.0 parallel_4.0.3 SummarizedExperiment_1.20.0 RColorBrewer_1.1-2 yaml_2.2.1
[61] curl_4.3 memoise_1.1.0 stringi_1.5.3 RSQLite_2.2.1 S4Vectors_0.28.1 BiocGenerics_0.36.0 zip_2.1.1 BiocParallel_1.24.1 GenomeInfoDb_1.26.2 rlang_0.4.9
[71] pkgconfig_2.0.3 matrixStats_0.58.0 bitops_1.0-6 lattice_0.20-41 htmlwidgets_1.5.3 labeling_0.4.2 bit_4.0.4 tidyselect_1.1.0 magrittr_2.0.1 DESeq2_1.30.0
[81] R6_2.5.0 IRanges_2.24.1 generics_0.1.0 DelayedArray_0.16.0 DBI_1.1.0 pillar_1.4.7 haven_2.3.1 foreign_0.8-81 withr_2.3.0 survival_3.2-7
[91] abind_1.4-5 RCurl_1.98-1.2 modelr_0.1.8 crayon_1.3.4 car_3.0-10 BiocFileCache_1.14.0 progress_1.2.2 locfit_1.5-9.4 grid_4.0.3 readxl_1.3.1
[101] data.table_1.13.4 blob_1.2.1 reprex_0.3.0 digest_0.6.27 xtable_1.8-4 gridGraphics_0.5-1 openssl_1.4.3 stats4_4.0.3 munsell_0.5.0 ggplotify_0.0.5
[111] askpass_1.1
LS0tCnRpdGxlOiAiTG9nby1TZXF1ZW5jZSBHZW5lcmF0b3IgZm9yIFJOQS1JbW11bm9wcmVjaXBpdGF0aW9uIGZvbGxvd2VkIGJ5IHNlcXVlbmNpbmciCmF1dGhvcjoKICBhZmZpbGlhdGlvbjogSW50ZXJkaXNjaXBsaW5hcnkgQ2VudGVyIGZvciBDbGluaWNhbCBSZXNlYXJjaCAtIFJXVEgtQWFjaGVuCiAgbmFtZTogQWxpIFQuIEFiZGFsbGFoCiAgZm9udHNpemU6IDE1cHQKZGF0ZTogIjA5LjAzLjIwMjAiCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICBoaWdobGlnaHQ6IGthdGUKICB0aGVtZTogeWV0aQotLS0KCjxzdHlsZT4KLm1haW4tY29udGFpbmVyewogIG1pbi13aWR0aDogMTgwMHB4OyFpbXBvcnRhbnQKICBtYXJnaW4tbGVmdDogYXV0bzshaW1wb3J0YW50CiAgbWFyZ2luLXJpZ2h0OiBhdXRvOyFpbXBvcnRhbnQKICBmb250LXNpemU6IDE1cHg7IWltcG9ydGFudAp9Ci50YWJzZXR7CiAgZm9udC1zaXplOiAxNXB4OyFpbXBvcnRhbnQKfQouZG93bmxvYWR7CglwYWRkaW5nOiAxMHB4IDE1cHg7CgliYWNrZ3JvdW5kOiAjNDQ3OUJBOwoJY29sb3I6ICNGRkY7Cgktd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweDsKCS1tb3otYm9yZGVyLXJhZGl1czogNHB4OwoJYm9yZGVyLXJhZGl1czogNHB4OwoJYm9yZGVyOiBzb2xpZCAxcHggIzIwNTM4RDsKCXRleHQtc2hhZG93OiAwIC0xcHggMCByZ2JhKDAsIDAsIDAsIDAuNCk7Cgktd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQpLCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjIpOwoJLW1vei1ib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC40KSwgMCAxcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4yKTsKCWJveC1zaGFkb3c6IGluc2V0IDAgMXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjQpLCAwIDFweCAxcHggcmdiYSgwLCAwLCAwLCAwLjIpOwoJLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjJzOwoJLW1vei10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjJzOwoJdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4yczsKCS13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTsKCS1tb3otdXNlci1zZWxlY3Q6bm9uZTsKCS1tcy11c2VyLXNlbGVjdDpub25lOwoJdXNlci1zZWxlY3Q6bm9uZTsKfQouZG93bmxvYWQ6aG92ZXJ7CgliYWNrZ3JvdW5kOiAjMzU2MDk0OwoJYm9yZGVyOiBzb2xpZCAxcHggIzJBNEU3NzsKCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQouZG93bmxvYWQ6YWN0aXZlewoJLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDFweCA0cHggcmdiYSgwLCAwLCAwLCAwLjYpOwoJLW1vei1ib3gtc2hhZG93OiBpbnNldCAwIDFweCA0cHggcmdiYSgwLCAwLCAwLCAwLjYpOwoJYm94LXNoYWRvdzogaW5zZXQgMCAxcHggNHB4IHJnYmEoMCwgMCwgMCwgMC42KTsKCWJhY2tncm91bmQ6ICMyRTU0ODE7Cglib3JkZXI6IHNvbGlkIDFweCAjMjAzRTVGOwp9CgojdG9jX2NvbnRhaW5lciB7CiAgICBiYWNrZ3JvdW5kOiAjZjlmOWY5IG5vbmUgcmVwZWF0IHNjcm9sbCAwIDA7CiAgICBib3JkZXI6IDBweCBzb2xpZCAjYWFhOwogICAgZGlzcGxheTogdGFibGU7CiAgICBmb250LXNpemU6IDEwMCU7CiAgICBtYXJnaW4tYm90dG9tOiAxZW07CiAgICBwYWRkaW5nOiAxMHB4OwogICAgd2lkdGg6IGF1dG87Cn0KCi50b2NfdGl0bGUgewogICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KCmg0IGF7CmNvbG9yOiMwMDAwODA7CmZvbnQtd2VpZ2h0OmJvbGQ7Cn0KCmg1IGF7CmNvbG9yOiMwMDgwODA7CmZvbnQtd2VpZ2h0OmJvbGQ7Cn0KCmxpIGEgewpjb2xvcjojMDAwMDgwCn0KCiN0b2NfY29udGFpbmVyIGxpLCAjdG9jX2NvbnRhaW5lciBvbCwgI3RvY19jb250YWluZXIgb2wgbGl7CiAgICBsaXN0LXN0eWxlOiBvdXRzaWRlIG5vbmUgbm9uZSAhaW1wb3J0YW50Owp9Cjwvc3R5bGU+CgoKPGRpdiBpZD0idG9jX2NvbnRhaW5lciI+CjxwIGNsYXNzPSJ0b2NfdGl0bGUiIGlkPSJiYWNrIj48aDQgc3R5bGU9ImNvbG9yOiM4MDAwMDAiPjxiPlRhYmxlIG9mIENvbnRlbnRzPC9iPjwvaDQ+PC9wPgo8b2wgY2xhc3M9InRvY19saXN0IiBzdHlsZT0iZm9udC1zaXplOjE1cHgiPgogIDxsaT48YSBocmVmPSIjdG9wX3RyYW5zY3JpcHRfdGFibGUiPjxiPjEuIFRhYmxlIG9mIHRvcCBhYnVuZGFudCB0cmFuc2NyaXB0cyAoRlBLTSA+IDEpIDwvYj48L2E+PC9saT4KICA8bGk+PGEgaHJlZj0iI1NlcXVlbmNlcyI+PGI+Mi4gU2VxdWVuY2VzIGFuZCBhbm5vdGF0aW9uPC9iPjwvYT4gPC9saT4KICA8bGk+PGEgaHJlZj0iI01vdGlmcyI+PGI+My4gR2VuZXJhdGlvbiBvZiBtb3RpZiBpbnN0YW5jZXM8L2I+PC9hPjwvbGk+CiAgPGxpPjxhIGhyZWY9IiNNYXRjaGVzIj48Yj40LiBHZW5lcmF0aW9uIG9mIG1hdGNoIGRhdGE8L2I+PC9hPjwvbGk+CiAgPGxpPjxhIGhyZWY9IiNMb2dvcyI+PGI+NS4gR2VuZXJhdGlvbiBvZiBzZXF1ZW5jZSBMb2dvczwvYj48L2E+PC9saT4KPC9vbD4KPC9kaXY+CgoKCiMjIHsudGFic2V0IC50YWJzZXQtZmFkZSB9CgpgYGB7ciBzZXR1cCwgZWNobz1GfQpsaWJyYXJ5KGJpb21hUnQpCmxpYnJhcnkoRFQpCmBgYApgYGB7ciBjb25maWcsIGVjaG89Rn0KREVCVUcgPC0gRgpMT0NBTF9NT1VOVF9QT0lOVCAgPC0gIi9uZXh0Z2VuIgpSRU1PVEVfTU9VTlRfUE9JTlQgPC0gIiIKUEFUSF9NT1VOVF9QUkVGSVggIDwtIHBhc3RlKExPQ0FMX01PVU5UX1BPSU5ULCIvIixSRU1PVEVfTU9VTlRfUE9JTlQsIHNlcD0iIikKQkFUQ0hfUEFUSFMgPC0gbGlzdCgic2NyYXRjaC9kYXRhL3Byb2plY3RzL2RldnJpZXMvdGFibGVzXzIwMDkxMSIsICJzY3JhdGNoL2RhdGEvcHJvamVjdHMvZGV2cmllcy90YWJsZXNfMjAwOTExIikgClNBTVBMRV9OQU1FX1BSRUZJWCA8LSAiU3VtbWFyaXplZE1hdGNoVGFibGVfR0ZpbHRlcmVkXyIKQkFUQ0guTkFNRVMgPC0gYygibXJuYSIsICJuY3JuYSIpClNBTVBMRV9CQVRDSEVTIDwtIGxpc3QoYygibXJuYSIpLCBjKCJuY3JuYSIpKQptUk5BIDwtIDEKbmNSTkEgPC0gMgpDb2xvckNvbWJvNTMgPC0gYygiIzAyODQ4MiIsICIjN0FCQTdBIiwiI0I3NkVCOCIpIApnZW5lcyA8LSByZWFkLnRhYmxlKCJHZW5lcyIsIGhlYWRlcj1ULCBzZXAgPSAiXHQiKQpnZW5lcy5vbGQgPC0gcmVhZC50YWJsZSgiZGV2cmllc19nZW5lTGlzdC50eHQiLCBoZWFkZXI9VCwgc2VwID0gIlx0IikKZ2VuZXMkR0VORV9TWU1CT0wKYGBgCgo8aDQgaWQ9InRvcF90cmFuc2NyaXB0X3RhYmxlIj4gPGEgaHJlZj0iI2JhY2siPjEuIFRhYmxlIG9mIHRvcCBhYnVuZGFudCB0cmFuc2NyaXB0cyAoRlBLTSA+PSAxKTwvYT48L2g0PgpLZWVwIHRyYW5zY3JpcHRzIHdpdGggcHJlZGljdGVkIEZQS00gZ3JlYXRlciBvciBlcXVhbCB0byAxIGluIGVpdGhlciBvZiBib3RoIGNvbmRpdGlvbnMgKGhuUk5QTCB2cy4gSW5wdXRLRzFhKeKAlGZ1cnRoZXJtb3JlLCByZW1vdmUgdHJhbnNjcmlwdHMgd2l0aCBhIG5vbi1wb3NpdGl2ZSBsb2cgb2YgRlBLTSByYXRpby4gSGVyZSBjYWxsZWQgTDJGQy4gVGhpcyBpcyBwb3NzaWJsZSBhcmUgbm90IGFsbCB0cmFuc2NyaXB0cyBpbiB0aGUgbGlzdCBvZiB0b3AgZ2VuZXMgbXVzdCBiZSB1cHJlZ3VsYXRlZCAoTDJGQyA+PSAxKS4KCgpgYGB7ciBlY2hvPUZ9CnNhbXBsZV9pZHMgPC0gbGlzdCgiMTkzNCIsICIxOTM4IiwgIjE5NDIiLCAiMTkzMiIsICIxOTM2IiwgIjE5NDAiKQpuYW1lcyhzYW1wbGVfaWRzKSA8LSBjKCJJUGhuUk5QSyIsICJJUGhuUk5QS18yIiwgIklQaG5STlBLXzMiLCAiSW5wdXRLRzFhIiwgIklucHV0S0cxYV8zIiwgIklucHV0S0cxYV8yIikKZnBrbV9saXN0IDwtIHZlY3RvcigibGlzdCIsIGxlbmd0aChzYW1wbGVfaWRzKSkKZm9yKGkgaW4gMTpsZW5ndGgoc2FtcGxlX2lkcykpewogIGZwa21fbGlzdFtbaV1dIDwtIHJlYWQudGFibGUocGFzdGUoIi9uZXh0Z2VuL3NjcmF0Y2gvbmV4dGdlbi9ydW5zL3JuYXNlcS4xMTkvM19jdWZmbGlua3MvIixzYW1wbGVfaWRzW1tpXV0sIi9pc29mb3Jtcy5mcGttX3RyYWNraW5nIiwgc2VwPSIiKSwgaGVhZGVyPVQsIHNlcD0iXHQiKQp9CmZvcihpIGluIDE6bGVuZ3RoKHNhbXBsZV9pZHMpKXsKICBmcGttX2xpc3RbW2ldXSA8LSAgIGZwa21fbGlzdFtbaV1dWyxjKCJ0X25hbWUiLCAiZ2VuZV9pZCIsICJnZW5lX25hbWUiLCAiRlBLTSIsICJjb3YiKV0KICBjb2xuYW1lcyhmcGttX2xpc3RbW2ldXSkgPC0gYygidF9uYW1lIiwgImdlbmVfaWQiLCAiZ2VuZV9uYW1lIiwgcGFzdGUoIkZQS00uIixuYW1lcyhzYW1wbGVfaWRzKVtpXSxzZXA9IiIpLCBwYXN0ZSgiQ09WLiIsbmFtZXMoc2FtcGxlX2lkcylbaV0sc2VwPSIiKSkKfQpsaWJyYXJ5KGdlbmVmaWx0ZXIpCmxpYnJhcnkodGlkeXZlcnNlKQpmcGttX3RhYmxlIDwtIGZwa21fbGlzdCAlPiUgcHVycnI6OnJlZHVjZShsZWZ0X2pvaW4sIGJ5ID0gYygidF9uYW1lIiwgImdlbmVfaWQiLCAiZ2VuZV9uYW1lIikpCmZwa21fdGFibGUuZmlsdGVyZWQgPC0gZnBrbV90YWJsZVsoZnBrbV90YWJsZSRDT1YuSVBoblJOUEsgPj0gMSAmIGZwa21fdGFibGUkQ09WLklQaG5STlBLXzIgPj0gMSAmIGZwa21fdGFibGUkQ09WLklQaG5STlBLXzMgPj0gMSAmIGZwa21fdGFibGUkRlBLTS5JUGhuUk5QSyA+PSAxICYgZnBrbV90YWJsZSRGUEtNLklQaG5STlBLXzIgPj0gMSAmIGZwa21fdGFibGUkRlBLTS5JUGhuUk5QS18zID49IDEpICxdCgojIChmcGttX3RhYmxlJENPVi5JbnB1dEtHMWEgPj0gMSAmIGZwa21fdGFibGUkQ09WLklucHV0S0cxYV8yID49IDEgJiBmcGttX3RhYmxlJENPVi5JbnB1dEtHMWFfMyA+PSAxICYgZnBrbV90YWJsZSRGUEtNLklucHV0S0cxYSA+PSAxICYgZnBrbV90YWJsZSRGUEtNLklucHV0S0cxYV8yID49IDEgJiBmcGttX3RhYmxlJEZQS00uSW5wdXRLRzFhXzMgPj0gMSkKCmZwa21fdGFibGUuZmlsdGVyZWQgPC0gZnBrbV90YWJsZS5maWx0ZXJlZFtmcGttX3RhYmxlLmZpbHRlcmVkJGdlbmVfbmFtZSAlaW4lIGdlbmVzJEdFTkVfU1lNQk9MIHwgZnBrbV90YWJsZS5maWx0ZXJlZCRnZW5lX2lkICVpbiUgZ2VuZXMkR0VORV9TWU1CT0wsXQpjb2xuYW1lcyhmcGttX3RhYmxlLmZpbHRlcmVkKVsxOjNdIDwtIGMoImVuc2VtYmxfdHJhbnNjcmlwdF9pZCIsICJlbnNlbWJsX2dlbmVfaWQiLCAiaGduY19zeW1ib2wiKQoKZnBrbV90YWJsZS5maWx0ZXJlZCA8LSBmcGttX3RhYmxlLmZpbHRlcmVkWywgYygxLDIsMyw0LDYsOCwxMCwxMiwxNCw1LDcsOSwxMSwxMywxNSldCmZwa21fdGFibGUuZmlsdGVyZWQkbWVhbkhuUk5QSyA8LSByb3dNZWFucyhmcGttX3RhYmxlLmZpbHRlcmVkWyw0OjZdKQpmcGttX3RhYmxlLmZpbHRlcmVkJG1lYW5JbnB1dEtHMWEgPC0gcm93TWVhbnMoZnBrbV90YWJsZS5maWx0ZXJlZFssNzo5XSkKZnBrbV90YWJsZS5maWx0ZXJlZCRzdGREZXZIblJOUE0gPC0gcm93U2RzKGFzLm1hdHJpeChmcGttX3RhYmxlLmZpbHRlcmVkWyw0OjZdKSkKZnBrbV90YWJsZS5maWx0ZXJlZCRzdGREZXZJbnB1dEtHMWEgPC0gcm93U2RzKGFzLm1hdHJpeChmcGttX3RhYmxlLmZpbHRlcmVkWyw3OjldKSkKZnBrbV90YWJsZS5maWx0ZXJlZCRMMkZDIDwtIGxvZzIoZnBrbV90YWJsZS5maWx0ZXJlZCRtZWFuSG5STlBLLygxK2Zwa21fdGFibGUuZmlsdGVyZWQkbWVhbklucHV0S0cxYSkpCmZwa21fdGFibGUuZmlsdGVyZWQgPC0gZnBrbV90YWJsZS5maWx0ZXJlZFtmcGttX3RhYmxlLmZpbHRlcmVkJEwyRkMgPj0gMSAmIGZwa21fdGFibGUuZmlsdGVyZWQkc3RkRGV2SG5STlBNIDwgZnBrbV90YWJsZS5maWx0ZXJlZCRtZWFuSG5STlBLLF0KZnBrbV90YWJsZS5maWx0ZXJlZCA8LSBmcGttX3RhYmxlLmZpbHRlcmVkWywgYygxOjMsbmNvbChmcGttX3RhYmxlLmZpbHRlcmVkKSw1Om5jb2woZnBrbV90YWJsZS5maWx0ZXJlZCktMSldCkRUOjpkYXRhdGFibGUoYXMuZGF0YS5mcmFtZShmcGttX3RhYmxlLmZpbHRlcmVkKSwgcm93bmFtZXMgPSBGLCBmaWx0ZXIgPSAndG9wJywgY2FwdGlvbiA9ICdGUEtNIGRhdGEgb2YgYWJ1bmRhbnQgdHJhbnNjcmlwdHMgb2YgdG9wIGdlbmVzJywgZXh0ZW5zaW9ucyA9ICdCdXR0b25zJywgb3B0aW9ucyA9IGxpc3Qoc2Nyb2xsWCA9IFRSVUUsIGRvbSA9ICdCZnJ0aXAnLCBidXR0b25zID0gbGlzdChsaXN0KGV4dGVuZD0nY29weScsdGl0bGU9IkZQS01BYnVuZGFudFRvcFRyYW5zY3JpcHRzIiksbGlzdChleHRlbmQ9J2NzdicsdGl0bGU9IkZQS01BYnVuZGFudFRvcFRyYW5zY3JpcHRzIiksbGlzdChleHRlbmQ9J2V4Y2VsJyxmaWxlbmFtZT0iRlBLTUFidW5kYW50VG9wVHJhbnNjcmlwdHMiKSxsaXN0KGV4dGVuZD0ncGRmJyxmaWxlbmFtZT0iRlBLTUFidW5kYW50VG9wVHJhbnNjcmlwdHMiKSxsaXN0KGV4dGVuZD0ncHJpbnQnLGZpbGVuYW1lPSJGUEtNQWJ1bmRhbnRUb3BUcmFuc2NyaXB0cyIpKSwgYXV0b1dpZHRoID0gVFJVRSwgcGFnZUxlbmd0aCA9IDEwLCBjb2x1bW5EZWZzID0gbGlzdChsaXN0KGNsYXNzTmFtZSA9ICdkdC1sZWZ0JykpKSkKYGBgCgoKIyMgey50YWJzZXQgLnRhYnNldC1mYWRlIH0KCjxoNCBpZD0iU2VxdWVuY2VzIj4gPGEgaHJlZj0iI2JhY2siPjIuIFNlcXVlbmNlcyBhbmQgQW5ub3RhdGlvbjwvYT48L2g0PgoKYGBge3IgcmVhZC5kYXRhYmFzZSwgZWNobz1GfQojIyBTZWxlY3QgRW5zZW1ibCBNYXJ0CmVuc21hcnQgPC0gYmlvbWFSdDo6dXNlTWFydCgiZW5zZW1ibCIsICBob3N0PSJ1c3dlc3QuZW5zZW1ibC5vcmciLCBkYXRhc2V0PSJoc2FwaWVuc19nZW5lX2Vuc2VtYmwiLCB2ZXJib3NlPUYpIAojIyBHZXQgYWxsIHRyYW5zY3JpcHQgYW5ub3RhdGlvbnMKI2xpc3RBdHRyaWJ1dGVzKGVuc21hcnQpCnRvcF90cmFuc2NyaXB0c19tZXRhIDwtIGJpb21hUnQ6OmdldEJNKGF0dHJpYnV0ZXM9YygiaGduY19zeW1ib2wiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbnNlbWJsX2dlbmVfaWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaHJvbW9zb21lX25hbWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGFydF9wb3NpdGlvbiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuZF9wb3NpdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyYW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbnNlbWJsX3RyYW5zY3JpcHRfaWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zY3JpcHRfc3RhcnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zY3JpcHRfZW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc2NyaXB0X2Jpb3R5cGUiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcnM9ImhnbmNfc3ltYm9sIiAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9dW5pcXVlKGZwa21fdGFibGUuZmlsdGVyZWQkaGduY19zeW1ib2wpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFydD1lbnNtYXJ0KQp0aHJlZV91dHIgPC0gMQpmaXZlX3V0ciA8LSAyCmNkcyA8LSAzCmNvbHVtbl9uYW1lcyA8LSBjKCIzdXRyIiwgIjV1dHIiLCAiY29kaW5nIikKc2VxdWVuY2VfYmF0Y2hlcyA8LSB2ZWN0b3IoImxpc3QiLCAzKQpmaWx0ZXJlZC5zZXF1ZW5jZV9iYXRjaGVzIDwtIHZlY3RvcigibGlzdCIsIDMpCnRvcF90cmFuc2NyaXB0c19tZXRhIDwtIHRvcF90cmFuc2NyaXB0c19tZXRhW3RvcF90cmFuc2NyaXB0c19tZXRhJGVuc2VtYmxfdHJhbnNjcmlwdF9pZCAlaW4lIGZwa21fdGFibGUuZmlsdGVyZWQkZW5zZW1ibF90cmFuc2NyaXB0X2lkLF0KCiMjIEdldCBhbGwgdHJhbnNjcmlwdCBzZXF1ZW5jZXMuCmZvcihpIGluIDE6bGVuZ3RoKHNlcXVlbmNlX2JhdGNoZXMpKXsKICBzZXF1ZW5jZV9iYXRjaGVzW1tpXV0gPC0gYmlvbWFSdDo6Z2V0U2VxdWVuY2UoaWQ9dG9wX3RyYW5zY3JpcHRzX21ldGEkZW5zZW1ibF90cmFuc2NyaXB0X2lkLCBzZXFUeXBlID0gY29sdW1uX25hbWVzW2ldLCBtYXJ0ID0gZW5zbWFydCwgdHlwZT0iZW5zZW1ibF90cmFuc2NyaXB0X2lkIikKICBmaWx0ZXJlZC5zZXF1ZW5jZV9iYXRjaGVzW1tpXV0gPC0gc2VxdWVuY2VfYmF0Y2hlc1tbaV1dW3NlcXVlbmNlX2JhdGNoZXNbW2ldXVssMV0gIT0gIlNlcXVlbmNlIHVuYXZhaWxhYmxlIixdCiAgIGZpbHRlcmVkLnNlcXVlbmNlX2JhdGNoZXNbW2ldXSA8LSBtZXJnZSggZmlsdGVyZWQuc2VxdWVuY2VfYmF0Y2hlc1tbaV1dICwgdG9wX3RyYW5zY3JpcHRzX21ldGEsIGJ5PSJlbnNlbWJsX3RyYW5zY3JpcHRfaWQiKQp9CgpuY3JuYSA8LSBiaW9tYVJ0OjpnZXRTZXF1ZW5jZShpZD10b3BfdHJhbnNjcmlwdHNfbWV0YSRlbnNlbWJsX3RyYW5zY3JpcHRfaWQsIHNlcVR5cGUgPSJjZG5hIiwgbWFydCA9IGVuc21hcnQsIHR5cGU9ImVuc2VtYmxfdHJhbnNjcmlwdF9pZCIpCm5jcm5hIDwtIG5jcm5hW25jcm5hJGVuc2VtYmxfdHJhbnNjcmlwdF9pZCAlaW4lIHRvcF90cmFuc2NyaXB0c19tZXRhW3RvcF90cmFuc2NyaXB0c19tZXRhJHRyYW5zY3JpcHRfYmlvdHlwZT09ImxuY1JOQSIsIF0kZW5zZW1ibF90cmFuc2NyaXB0X2lkLF0KYGBgCgojIyMgTWV0YWRhdGEgYmFzZWQgb24gZ2VuZSBpZApgYGB7ciBlY2hvPUZ9CkRUOjpkYXRhdGFibGUoYXMuZGF0YS5mcmFtZSh0b3BfdHJhbnNjcmlwdHNfbWV0YSksIHJvd25hbWVzID0gRiwgZmlsdGVyID0gJ3RvcCcsIGNhcHRpb24gPSAnTWV0YWRhdGEgb2YgYWJ1bmRhbnQgdHJhbnNjcmlwdHMgb2YgdG9wIGdlbmVzIHdpdGggYXZhaWxhYmxlIHNlcXVlbmNlJywgZXh0ZW5zaW9ucyA9ICdCdXR0b25zJywgb3B0aW9ucyA9IGxpc3Qoc2Nyb2xsWCA9IFRSVUUsIGRvbSA9ICdCZnJ0aXAnLCBidXR0b25zID0gbGlzdChsaXN0KGV4dGVuZD0nY29weScsdGl0bGU9Ik1ldGFkYXRhQWJ1bmRhbnRUb3BUcmFuc2NyaXB0cyIpLGxpc3QoZXh0ZW5kPSdjc3YnLHRpdGxlPSJNZXRhZGF0YUFidW5kYW50VG9wVHJhbnNjcmlwdHMiKSxsaXN0KGV4dGVuZD0nZXhjZWwnLGZpbGVuYW1lPSJNZXRhZGF0YUFidW5kYW50VG9wVHJhbnNjcmlwdHMiKSxsaXN0KGV4dGVuZD0ncGRmJyxmaWxlbmFtZT0iTWV0YWRhdGFBYnVuZGFudFRvcFRyYW5zY3JpcHRzIiksbGlzdChleHRlbmQ9J3ByaW50JyxmaWxlbmFtZT0iTWV0YWRhdGFBYnVuZGFudFRvcFRyYW5zY3JpcHRzIikpLCBhdXRvV2lkdGggPSBUUlVFLCBwYWdlTGVuZ3RoID0gMTAsIGNvbHVtbkRlZnMgPSBsaXN0KGxpc3QoY2xhc3NOYW1lID0gJ2R0LWxlZnQnKSkpKQpgYGAKCiMjIyBNZXRhZGF0YSBiYXNlZCBvbiBhdmFpbGFibGUgbVJOQSBzZXF1ZW5jZXMKYGBge3IgZWNobz1GfQpEVDo6ZGF0YXRhYmxlKGFzLmRhdGEuZnJhbWUodG9wX3RyYW5zY3JpcHRzX21ldGFbdG9wX3RyYW5zY3JpcHRzX21ldGEkZW5zZW1ibF90cmFuc2NyaXB0X2lkICVpbiUgZmlsdGVyZWQuc2VxdWVuY2VfYmF0Y2hlc1tbMV1dJGVuc2VtYmxfdHJhbnNjcmlwdF9pZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0b3BfdHJhbnNjcmlwdHNfbWV0YSRlbnNlbWJsX3RyYW5zY3JpcHRfaWQgJWluJSBmaWx0ZXJlZC5zZXF1ZW5jZV9iYXRjaGVzW1syXV0kZW5zZW1ibF90cmFuc2NyaXB0X2lkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRvcF90cmFuc2NyaXB0c19tZXRhJGVuc2VtYmxfdHJhbnNjcmlwdF9pZCAlaW4lIGZpbHRlcmVkLnNlcXVlbmNlX2JhdGNoZXNbWzNdXSRlbnNlbWJsX3RyYW5zY3JpcHRfaWQsXSksIHJvd25hbWVzID0gRiwgZmlsdGVyID0gJ3RvcCcsIGNhcHRpb24gPSAnTWV0YWRhdGEgb2YgYWJ1bmRhbnQgdHJhbnNjcmlwdHMgb2YgdG9wIGdlbmVzIHdpdGggYXZhaWxhYmxlIHNlcXVlbmNlJywgZXh0ZW5zaW9ucyA9ICdCdXR0b25zJywgb3B0aW9ucyA9IGxpc3Qoc2Nyb2xsWCA9IFRSVUUsIGRvbSA9ICdCZnJ0aXAnLCBidXR0b25zID0gbGlzdChsaXN0KGV4dGVuZD0nY29weScsdGl0bGU9Ik1ldGFkYXRhQWJ1bmRhbnRUb3BUcmFuc2NyaXB0cyIpLGxpc3QoZXh0ZW5kPSdjc3YnLHRpdGxlPSJNZXRhZGF0YUFidW5kYW50VG9wVHJhbnNjcmlwdHMiKSxsaXN0KGV4dGVuZD0nZXhjZWwnLGZpbGVuYW1lPSJNZXRhZGF0YUFidW5kYW50VG9wVHJhbnNjcmlwdHMiKSxsaXN0KGV4dGVuZD0ncGRmJyxmaWxlbmFtZT0iTWV0YWRhdGFBYnVuZGFudFRvcFRyYW5zY3JpcHRzIiksbGlzdChleHRlbmQ9J3ByaW50JyxmaWxlbmFtZT0iTWV0YWRhdGFBYnVuZGFudFRvcFRyYW5zY3JpcHRzIikpLCBhdXRvV2lkdGggPSBUUlVFLCBwYWdlTGVuZ3RoID0gMTAsIGNvbHVtbkRlZnMgPSBsaXN0KGxpc3QoY2xhc3NOYW1lID0gJ2R0LWxlZnQnKSkpKQpgYGAKCiMjIyBNZXRhZGF0YSBiYXNlZCBvbiBhdmFpbGFibGUgbG5jUk5BIHNlcXVlbmNlcwpgYGB7ciBlY2hvPUZ9Cm5jcm5hLmJhdGNoIDwtIHRvcF90cmFuc2NyaXB0c19tZXRhW3RvcF90cmFuc2NyaXB0c19tZXRhJGVuc2VtYmxfdHJhbnNjcmlwdF9pZCAlaW4lIG5jcm5hJGVuc2VtYmxfdHJhbnNjcmlwdF9pZCxdCkRUOjpkYXRhdGFibGUoYXMuZGF0YS5mcmFtZSh0b3BfdHJhbnNjcmlwdHNfbWV0YVt0b3BfdHJhbnNjcmlwdHNfbWV0YSRlbnNlbWJsX3RyYW5zY3JpcHRfaWQgJWluJSBuY3JuYSRlbnNlbWJsX3RyYW5zY3JpcHRfaWQsXSksIHJvd25hbWVzID0gRiwgZmlsdGVyID0gJ3RvcCcsIGNhcHRpb24gPSAnTWV0YWRhdGEgb2YgYWJ1bmRhbnQgdHJhbnNjcmlwdHMgb2YgdG9wIGdlbmVzIHdpdGggYXZhaWxhYmxlIHNlcXVlbmNlJywgZXh0ZW5zaW9ucyA9ICdCdXR0b25zJywgb3B0aW9ucyA9IGxpc3Qoc2Nyb2xsWCA9IFRSVUUsIGRvbSA9ICdCZnJ0aXAnLCBidXR0b25zID0gbGlzdChsaXN0KGV4dGVuZD0nY29weScsdGl0bGU9Ik1ldGFkYXRhQWJ1bmRhbnRUb3BUcmFuc2NyaXB0cyIpLGxpc3QoZXh0ZW5kPSdjc3YnLHRpdGxlPSJNZXRhZGF0YUFidW5kYW50VG9wVHJhbnNjcmlwdHMiKSxsaXN0KGV4dGVuZD0nZXhjZWwnLGZpbGVuYW1lPSJNZXRhZGF0YUFidW5kYW50VG9wVHJhbnNjcmlwdHMiKSxsaXN0KGV4dGVuZD0ncGRmJyxmaWxlbmFtZT0iTWV0YWRhdGFBYnVuZGFudFRvcFRyYW5zY3JpcHRzIiksbGlzdChleHRlbmQ9J3ByaW50JyxmaWxlbmFtZT0iTWV0YWRhdGFBYnVuZGFudFRvcFRyYW5zY3JpcHRzIikpLCBhdXRvV2lkdGggPSBUUlVFLCBwYWdlTGVuZ3RoID0gMTAsIGNvbHVtbkRlZnMgPSBsaXN0KGxpc3QoY2xhc3NOYW1lID0gJ2R0LWxlZnQnKSkpKQpgYGAKCgojIyMgU3VtbWFyeSBvbiBhdmFpbGFibGUgcmVnaW9ucyBpbiB0b3AgdHJhbnNjcmlwdHMKCmBgYHtyIGVjaG89Rn0KbmRmIDwtIHZlY3RvcigibGlzdCIsIDQpCnJlZ2lvbl9uYW1lcyA8LSBjKCJ0aHJlZV91dHIiLCAiZml2ZV91dHIiLCAiY2RzIiwgIm5jcm5hIikgCmZvcihpIGluIDE6Myl7CiAgbnVtYmVyX29mX3NlcXVlbmNlcyA8LSBsaXN0KG5yb3coc2VxdWVuY2VfYmF0Y2hlc1tbaV1dKSwgbnJvdyhmaWx0ZXJlZC5zZXF1ZW5jZV9iYXRjaGVzW1tpXV0pKQogIG5hbWVzKG51bWJlcl9vZl9zZXF1ZW5jZXMpIDwtIGMoImFsbF9zZXF1ZW5jZXMiLCAiYXZhaWxhYmxlX3NlcXVlbmNlcyIpCiAgbmRmW1tpXV0gPC0gYXMuZGF0YS5mcmFtZSh0KGFzLmRhdGEuZnJhbWUobnVtYmVyX29mX3NlcXVlbmNlcykpKQogIGNvbG5hbWVzKG5kZltbaV1dKSA8LSBjKCJjb3VudHMiKQogIG5kZltbaV1dJHJlZ2lvbiA8LSByZWdpb25fbmFtZXNbaV0KICBuZGZbW2ldXSR0eXBlIDwtIGlmZWxzZShyb3duYW1lcyhuZGZbW2ldXSk9PSJhdmFpbGFibGVfc2VxdWVuY2VzIiwgImF2YWlsYWJsZSIsICJhbGwiKQogIG5kZltbaV1dIDwtIG5kZltbaV1dWywgYygyLDEsMyldCn0KCm5zIDwtIGxpc3QoMTIsMTIpCm5hbWVzKG5zKSA8LSBjKCJhbGxfc2VxdWVuY2VzIiwiYXZhaWxhYmxlX3NlcXVlbmNlcyIpCm5kZltbNF1dIDwtIGFzLmRhdGEuZnJhbWUodChhcy5kYXRhLmZyYW1lKG5zKSkpCmNvbG5hbWVzKG5kZltbNF1dKSA8LSBjKCJjb3VudHMiKQpuZGZbWzRdXSRyZWdpb24gPC0gcmVnaW9uX25hbWVzWzRdCm5kZltbNF1dJHR5cGUgPC0gaWZlbHNlKHJvd25hbWVzKG5kZltbNF1dKT09ImF2YWlsYWJsZV9zZXF1ZW5jZXMiLCAiYXZhaWxhYmxlIiwgImFsbCIpCm5kZltbNF1dIDwtIG5kZltbNF1dWywgYygyLDEsMyldCgpyZWdpb25fYXZhaWxhYmlsaXR5IDwtIGRvLmNhbGwoInJiaW5kIiwgbmRmKQpEVDo6ZGF0YXRhYmxlKGFzLmRhdGEuZnJhbWUocmVnaW9uX2F2YWlsYWJpbGl0eSksIHJvd25hbWVzID0gRiwgZmlsdGVyID0gJ3RvcCcsIGNhcHRpb24gPSAnTnVtYmVyIG9mIGF2YWlsYWJsZSB0cmFuc2NyaXB0IHJlZ2lvbnMnLCBleHRlbnNpb25zID0gJ0J1dHRvbnMnLCBvcHRpb25zID0gbGlzdChkb20gPSAnQmZydGlwJywgYnV0dG9ucyA9IGxpc3QobGlzdChleHRlbmQ9J2NvcHknLHRpdGxlPSJSZWdpb25BdmFpbGFiaWxpdHlTdGF0cyIpLGxpc3QoZXh0ZW5kPSdjc3YnLHRpdGxlPSJSZWdpb25BdmFpbGFiaWxpdHlTdGF0cyIpLGxpc3QoZXh0ZW5kPSdleGNlbCcsZmlsZW5hbWU9IlJlZ2lvbkF2YWlsYWJpbGl0eVN0YXRzIiksbGlzdChleHRlbmQ9J3BkZicsZmlsZW5hbWU9IlJlZ2lvbkF2YWlsYWJpbGl0eVN0YXRzIiksbGlzdChleHRlbmQ9J3ByaW50JyxmaWxlbmFtZT0iUmVnaW9uQXZhaWxhYmlsaXR5U3RhdHMiKSksIGF1dG9XaWR0aCA9IFRSVUUsIHBhZ2VMZW5ndGggPSAxMCwgY29sdW1uRGVmcyA9IGxpc3QobGlzdChjbGFzc05hbWUgPSAnZHQtbGVmdCcpKSkpCgoKCmBgYAoKCiMjIHsudGFic2V0IC50YWJzZXQtZmFkZSB9CgoKPGg0IGlkPSJNb3RpZnMiPjxhIGhyZWY9IiNiYWNrIj4zLiBHZW5lcmF0aW9uIG9mIE1vdGlmIEluc3RhbmNlczwvYT48L2g0PgoKYGBge3IgZWNobz1GfQpmbGFuazEwIDwtIHBhc3RlKHJlcCgiLiIsMTApLGNvbGxhcHNlPSIiKQpmbGFuazIwIDwtIHBhc3RlKHJlcCgiLiIsMjApLGNvbGxhcHNlPSIiKQojIEludGVyYWN0aW9uIE1vdGlmcwppbnQubW90aWZzIDwtIHZlY3RvcigibGlzdCIsIDEzKQppbnQubW90aWZzLm5vR3MgPC0gdmVjdG9yKCJsaXN0IiwgMTMpCiMgUmVndWxhdG9yeSBNb3RpZnMKcmVnLm1vdGlmcyA8LSB2ZWN0b3IoImxpc3QiLCAyMykKcmVnLm1vdGlmcy5ub0dzIDwtIHZlY3RvcigibGlzdCIsIDIzKQojIFVuc3BlY2lmaWMgVGV0cmFudWNsZW90aWRlIChUQ0NDIG9yIENDQ0MpCnRldHJhLm1vdGlmLjEwIDwtIHBhc3RlKGZsYW5rMTAsIihUQ0NDfENDQ0MpIixmbGFuazEwLCBzZXA9IiIpCnRldHJhLm1vdGlmLjIwIDwtIHBhc3RlKGZsYW5rMjAsIihUQ0NDfENDQ0MpIixmbGFuazIwLCBzZXA9IiIpCgojIEdlbmVyYXRlIGFsbCBpbnRlcmFjdGlvbiBtb3RpZiBpbnN0YW5jZXMuCmZvcihzaSBpbiAxOjEyKXsKICBpbnQubW90aWZzW1tzaV1dIDwtIHBhc3RlKGZsYW5rMTAsIihUQ0NDfENDQ0MpIixwYXN0ZShyZXAoIi4iLHNpLTEpLGNvbGxhcHNlPSIiKSwiKFRDQ0N8Q0NDQykiLGZsYW5rMTAsIHNlcD0iIikKICBpbnQubW90aWZzLm5vR3NbW3NpXV0gPC0gcGFzdGUoZmxhbmsxMCwiKFRDQ0N8Q0NDQykiLHBhc3RlKHJlcCgiW0FDVF0iLHNpLTEpLGNvbGxhcHNlPSIiKSwiKFRDQ0N8Q0NDQykiLGZsYW5rMTAsIHNlcD0iIikKfQoKIyBHZW5lcmF0ZSBhbGwgcmVndWxhdG9yeSBtb3RpZiBpbnN0YW5jZXMuCmZvcihzIGluIDA6MjIpewogIHJlZy5tb3RpZnNbW3MrMV1dIDwtIGxpc3QoKQogIGZvcihsIGluIDA6cyl7CiAgIGZvcihtIGluIDA6bWF4KDAscy1sKSl7CiAgICAgZm9yKHIgaW4gMDptYXgoMCxzLShsK20pKSl7CiAgICAgICBpZihsK20rcj09cyl7CiAgICAgICAgICAjIHByaW50KHBhc3RlKCJsOiIsbCwiIG06IixtLCAiIHI6IixyLCIgPSAiLHMsc2VwPSIiKSkKICAgICAgICAgIHJlZy5tb3RpZnNbW3MrMV1dW1tsZW5ndGgocmVnLm1vdGlmc1tbcysxXV0pKzFdXSA8LSBwYXN0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiguLi4uLi4uLi4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihUQ0NDfENDQ0MpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUocmVwKCIuIixsKSxjb2xsYXBzZT0iIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoVENDQ3xDQ0NDKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlKHJlcCgiLiIsbSksY29sbGFwc2U9IiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFRDQ0N8Q0NDQykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZShyZXAoIi4iLHIpLGNvbGxhcHNlPSIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihUQ0NDfENDQ0MpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uLi4uLi4uLi4pIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcD0iIikKICAgICAgIH0KICAgICB9CiAgIH0KICB9CiAgcmVnLm1vdGlmc1tbcysxXV0gPC0gcGFzdGUodW5pcXVlKHVubGlzdCggcmVnLm1vdGlmc1tbcysxXV0pKSxjb2xsYXBzZT0iIHwgIikKfQoKIyBHZW5lcmF0ZSBhbGwgcmVndWxhdG9yeSBtb3RpZiBpbnN0YW5jZXMuCmZvcihzIGluIDA6MjIpewogIHJlZy5tb3RpZnMubm9Hc1tbcysxXV0gPC0gbGlzdCgpCiAgZm9yKGwgaW4gMDpzKXsKICAgZm9yKG0gaW4gMDptYXgoMCxzLWwpKXsKICAgICBmb3IociBpbiAwOm1heCgwLHMtKGwrbSkpKXsKICAgICAgIGlmKGwrbStyPT1zKXsKICAgICAgICAgICMgcHJpbnQocGFzdGUoImw6IixsLCIgbToiLG0sICIgcjoiLHIsIiA9ICIscyxzZXA9IiIpKQogICAgICAgICAgcmVnLm1vdGlmcy5ub0dzW1tzKzFdXVtbbGVuZ3RoKHJlZy5tb3RpZnMubm9Hc1tbcysxXV0pKzFdXSA8LSBwYXN0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiguLi4uLi4uLi4uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihUQ0NDfENDQ0MpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUocmVwKCJbQUNUXSIsbCksY29sbGFwc2U9IiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFRDQ0N8Q0NDQykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZShyZXAoIltBQ1RdIixtKSxjb2xsYXBzZT0iIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoVENDQ3xDQ0NDKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlKHJlcCgiW0FDVF0iLHIpLGNvbGxhcHNlPSIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihUQ0NDfENDQ0MpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uLi4uLi4uLi4pIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcD0iIikKICAgICAgIH0KICAgICB9CiAgIH0KICB9CiAgcmVnLm1vdGlmcy5ub0dzW1tzKzFdXSA8LSBwYXN0ZSh1bmlxdWUodW5saXN0KCByZWcubW90aWZzLm5vR3NbW3MrMV1dKSksY29sbGFwc2U9IiB8ICIpCn0KCmBgYAoKCiMjIyBJbnRlcmFjdGlvbiBNb3RpZnMKYGBge3IgdGFibGUuaW50Lm1vdGlmcywgZWNobz1GfQpkZi5pbnQubW90aWZzIDwtIGRhdGEuZnJhbWUoYG1vdGlmIGluc3RhbmNlYD1OVUxMLCBgbW90aWYgbGVuZ3RoYD1OVUxMKQoKZm9yKHMgaW4gMDoxMSl7CiAgdG1wX2RmIDwtIGFzLmRhdGEuZnJhbWUoaW50Lm1vdGlmc1tbcysxXV0pCiAgdG1wX2RmJGxlbmd0aCA8LSBzKzgKICBjb2xuYW1lcyh0bXBfZGYpIDwtIGMoIm1vdGlmIGluc3RhbmNlIiwgIm1vdGlmIGxlbmd0aCIpCiAgI3RtcF9kZiA8LSB0bXBfZGZbLGMoMiwxKV0KICBkZi5pbnQubW90aWZzIDwtIHJiaW5kKGRmLmludC5tb3RpZnMsIHRtcF9kZikKfQpEVDo6ZGF0YXRhYmxlKGFzLmRhdGEuZnJhbWUoZGYuaW50Lm1vdGlmcyksIHJvd25hbWVzID0gRiwgZmlsdGVyID0gJ3RvcCcsIGNhcHRpb24gPSAnVGFibGUgb2YgYWxsIGludGVyYWN0aW9uIG1vdGlmcyBieSBsZW5ndGgnLCBleHRlbnNpb25zID0gJ0J1dHRvbnMnLCBvcHRpb25zID0gbGlzdChkb20gPSAnQmZydGlwJywgYnV0dG9ucyA9IGxpc3QobGlzdChleHRlbmQ9J2NvcHknLHRpdGxlPSJJbnRNb3RpZnNMaXN0QnlMZW5ndGgiKSxsaXN0KGV4dGVuZD0nY3N2Jyx0aXRsZT0iSW50TW90aWZzTGlzdEJ5TGVuZ3RoIiksbGlzdChleHRlbmQ9J2V4Y2VsJyxmaWxlbmFtZT0iSW50TW90aWZzTGlzdEJ5TGVuZ3RoIiksbGlzdChleHRlbmQ9J3BkZicsZmlsZW5hbWU9IkludE1vdGlmc0xpc3RCeUxlbmd0aCIpLGxpc3QoZXh0ZW5kPSdwcmludCcsZmlsZW5hbWU9IkludE1vdGlmc0xpc3RCeUxlbmd0aCIpKSwgYXV0b1dpZHRoID0gVFJVRSwgcGFnZUxlbmd0aCA9IDEwLCBjb2x1bW5EZWZzID0gbGlzdChsaXN0KGNsYXNzTmFtZSA9ICdkdC1sZWZ0JykpKSkKCmBgYAoKIyMjIEludGVyYWN0aW9uIE1vdGlmcyAobm8gY3JpdGljYWwgR3MpCmBgYHtyIHRhYmxlLmludC5tb3RpZnMubm9HcywgZWNobz1GfQpkZi5pbnQubW90aWZzLm5vR3MgPC0gZGF0YS5mcmFtZShgbW90aWYgaW5zdGFuY2VgPU5VTEwsIGBtb3RpZiBsZW5ndGhgPU5VTEwpCgpmb3IocyBpbiAwOjExKXsKICB0bXBfZGYgPC0gYXMuZGF0YS5mcmFtZShpbnQubW90aWZzLm5vR3NbW3MrMV1dKQogIHRtcF9kZiRsZW5ndGggPC0gcys4CiAgY29sbmFtZXModG1wX2RmKSA8LSBjKCJtb3RpZiBpbnN0YW5jZSIsICJtb3RpZiBsZW5ndGgiKQogICN0bXBfZGYgPC0gdG1wX2RmWyxjKDIsMSldCiAgZGYuaW50Lm1vdGlmcy5ub0dzIDwtIHJiaW5kKGRmLmludC5tb3RpZnMubm9HcywgdG1wX2RmKQp9CkRUOjpkYXRhdGFibGUoYXMuZGF0YS5mcmFtZShkZi5pbnQubW90aWZzLm5vR3MpLCByb3duYW1lcyA9IEYsIGZpbHRlciA9ICd0b3AnLCBjYXB0aW9uID0gJ1RhYmxlIG9mIGFsbCBpbnRlcmFjdGlvbiBtb3RpZnMgd2l0aG91dCBjcml0aWNhbCBHcyBieSBsZW5ndGgnLCBleHRlbnNpb25zID0gJ0J1dHRvbnMnLCBvcHRpb25zID0gbGlzdChkb20gPSAnQmZydGlwJywgYnV0dG9ucyA9IGxpc3QobGlzdChleHRlbmQ9J2NvcHknLHRpdGxlPSJJbnRNb3RpZnNMaXN0QnlMZW5ndGgiKSxsaXN0KGV4dGVuZD0nY3N2Jyx0aXRsZT0iSW50TW90aWZzTGlzdEJ5TGVuZ3RoIiksbGlzdChleHRlbmQ9J2V4Y2VsJyxmaWxlbmFtZT0iSW50TW90aWZzTGlzdEJ5TGVuZ3RoIiksbGlzdChleHRlbmQ9J3BkZicsZmlsZW5hbWU9IkludE1vdGlmc0xpc3RCeUxlbmd0aCIpLGxpc3QoZXh0ZW5kPSdwcmludCcsZmlsZW5hbWU9IkludE1vdGlmc0xpc3RCeUxlbmd0aCIpKSwgYXV0b1dpZHRoID0gVFJVRSwgcGFnZUxlbmd0aCA9IDEwLCBjb2x1bW5EZWZzID0gbGlzdChsaXN0KGNsYXNzTmFtZSA9ICdkdC1sZWZ0JykpKSkKCmBgYAoKIyMjIFJlZ3VsYXRvcnkgTW90aWZzCmBgYHtyIHRhYmxlLnJlZy5tb3RpZnMsIGVjaG89Rn0KZGYgPC0gZGF0YS5mcmFtZShgbW90aWYgaW5zdGFuY2VgPU5VTEwsIGBtb3RpZiBsZW5ndGhgPU5VTEwpCgpmb3IocyBpbiAwOjIyKXsKICB0bXBfZGYgPC0gYXMuZGF0YS5mcmFtZShyZWcubW90aWZzW1tzKzFdXSkKICB0bXBfZGYkbGVuZ3RoIDwtIHMrMTYKICBjb2xuYW1lcyh0bXBfZGYpIDwtIGMoIm1vdGlmIGluc3RhbmNlIiwgIm1vdGlmIGxlbmd0aCIpCiAgI3RtcF9kZiA8LSB0bXBfZGZbLGMoMiwxKV0KICBkZiA8LSByYmluZChkZiwgdG1wX2RmKQp9CgoKRFQ6OmRhdGF0YWJsZShhcy5kYXRhLmZyYW1lKGRmKSwgcm93bmFtZXMgPSBGLCBmaWx0ZXIgPSAndG9wJywgY2FwdGlvbiA9ICdUYWJsZSBvZiBhbGwgcmVndWxhdG9yeSBtb3RpZnMgYnkgbGVuZ3RoJywgZXh0ZW5zaW9ucyA9ICdCdXR0b25zJywgb3B0aW9ucyA9IGxpc3Qoc2Nyb2xsWCA9IFRSVUUsIGRvbSA9ICdCZnJ0aXAnLCBidXR0b25zID0gbGlzdChsaXN0KGV4dGVuZD0nY29weScsdGl0bGU9IlJlZ01vdGlmc0xpc3RCeUxlbmd0aCIpLGxpc3QoZXh0ZW5kPSdjc3YnLHRpdGxlPSJSZWdNb3RpZnNMaXN0QnlMZW5ndGgiKSxsaXN0KGV4dGVuZD0nZXhjZWwnLGZpbGVuYW1lPSJSZWdNb3RpZnNMaXN0QnlMZW5ndGgiKSxsaXN0KGV4dGVuZD0ncGRmJyxmaWxlbmFtZT0iUmVnTW90aWZzTGlzdEJ5TGVuZ3RoIiksbGlzdChleHRlbmQ9J3ByaW50JyxmaWxlbmFtZT0iUmVnTW90aWZzTGlzdEJ5TGVuZ3RoIikpLCBhdXRvV2lkdGggPSBUUlVFLCBwYWdlTGVuZ3RoID0gNSwgY29sdW1uRGVmcyA9IGxpc3QobGlzdChjbGFzc05hbWUgPSAnZHQtbGVmdCcpKSkpCgpgYGAKCgojIyB7LnRhYnNldCAudGFic2V0LWZhZGUgfQoKPGg0IGlkPSJNYXRjaGVzIj48YSBocmVmPSIjYmFjayI+NC4gR2VuZXJhdGlvbiBvZiBNYXRjaCBEYXRhPC9hPjwvaDQ+CmBgYHtyIHJlYWQubmNybmEuaW5wdXQsIGVjaG89Rn0KIyMgU3BsaXQgaW50byBuY3JuYSBhbmQgbXJuYQojIyBTcGxpdCBpbnRvIDN1dHIsIDV1dHIgYW5kIGNkcwojIyBTcGxpdCBpbnRvIGludGVyYWN0aW9uIGFuZCByZWd1bGF0b3J5IG1vdGlmcwpuY3JuYSA8LSAxCm1ybmEgPC0gMgppbnRlcmFjdGlvbiA8LSAxCnJlZ3VsYXRvcnkgPC0gMgp0aHJlZV91dHIgPC0gMQpmaXZlX3V0ciA8LSAyCmNkcyA8LSAzCgojIyBiaW90eXBlcwptYXRjaF9kYXRhIDwtIHZlY3RvcigibGlzdCIsIDIpCm1hdGNoX2RhdGFbW25jcm5hXV0gPC0gdmVjdG9yKCJsaXN0IiwgMykKbWF0Y2hfZGF0YVtbbXJuYV1dIDwtIHZlY3RvcigibGlzdCIsIDMpCgpmb3Ioc2IgaW4gMTpsZW5ndGgoc2VxdWVuY2VfYmF0Y2hlcykpewogIG1hdGNoX2RhdGFbW21ybmFdXVtbc2JdXSA8LSBmaWx0ZXJlZC5zZXF1ZW5jZV9iYXRjaGVzW1tzYl1dW2ZpbHRlcmVkLnNlcXVlbmNlX2JhdGNoZXNbW3NiXV0kdHJhbnNjcmlwdF9iaW90eXBlPT0icHJvdGVpbl9jb2RpbmciLF0KfQoKZm9yKHNiIGluIDE6bGVuZ3RoKHNlcXVlbmNlX2JhdGNoZXMpKXsKICBtYXRjaF9kYXRhW1tuY3JuYV1dW1tzYl1dIDwtIGZpbHRlcmVkLnNlcXVlbmNlX2JhdGNoZXNbW3NiXV1bbmNybmEuYmF0Y2gkdHJhbnNjcmlwdF9iaW90eXBlPT0ibG5jUk5BIixdCn0KCmBgYAoKCmBgYHtyIGdlbmVyYXRlLm1hdGNoZXMubXJuYSwgZWNobz1GfQpzcGVjaWZpYy5tYXRjaGVzLm1ybmEgPC0gdmVjdG9yKCJsaXN0IiwgMykKc3BlY2lmaWMucmVndWxhdG9yeS5tYXRjaGVzLm1ybmEgPC0gdmVjdG9yKCJsaXN0IiwgMykKdW5zcGVjaWZpYy5tYXRjaGVzLm1ybmEgPC0gdmVjdG9yKCJsaXN0IiwgMykKY29sdW1uX25hbWVzIDwtIGMoIjN1dHIiLCAiNXV0ciIsICJjb2RpbmciKQpmb3Ioc2IgaW4gMTozKXsKICBwcmludChwYXN0ZSgiQ29tcHV0aW5nIG1hdGNoZXMgZm9yICIsY29sdW1uX25hbWVzW3NiXSwiIHJlZ2lvbi4iLCBzZXA9IiIpKQogIHNwZWNpZmljLm1hdGNoZXMubXJuYVtbc2JdXSA8LSB2ZWN0b3IoImxpc3QiLCAxMSkKICBmb3IocyBpbiAxOjEyKXsKICAgIHByaW50KHBhc3RlKCIgICAgQ29tcHV0aW5nIG1hdGNoZXMgZm9yIGludGVyYWN0aW9uIG1vdGlmIG9mIGxlbmd0aCAiLChzKzcpLCIuIiwgc2VwPSIiKSkKICAgIHNwZWNpZmljLm1hdGNoZXMubXJuYVtbc2JdXVtbc11dIDwtIG1hdGNoX2RhdGFbW21ybmFdXVtbc2JdXVssMl0gJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5ncjo6c3RyX2V4dHJhY3RfYWxsKGludC5tb3RpZnNbW3NdXSwgc2ltcGxpZnkgPSBGKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5vbWl0KCkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KCkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMudmVjdG9yKCkKICAgIHByaW50KHBhc3RlKCIgICAgQ29tcHV0aW5nIG1hdGNoZXMgZm9yIGludGVyYWN0aW9uIG1vdGlmIG9mIGxlbmd0aCAiLChzKzcpLCIgZW5kZWQuIiwgc2VwPSIiKSkKICB9CiAgdW5zcGVjaWZpYy5tYXRjaGVzLm1ybmFbW3NiXV0gPC0gYXMudmVjdG9yKG5hLm9taXQodW5saXN0KHN0cmluZ3I6OnN0cl9leHRyYWN0X2FsbChtYXRjaF9kYXRhW1ttcm5hXV1bW3NiXV1bLDJdLCB0ZXRyYS5tb3RpZi4xMCkpKSkKICBwcmludChwYXN0ZSgiQ29tcHV0aW5nIG1hdGNoZXMgZm9yIHVuc3BlY2lmaWMgdGV0cmFudWNsZW90aWRlIENDQ0Mgb3IgVENDQ0MgZW5kZWQuIiwgc2VwPSIiKSkKfQpgYGAKCgpgYGB7ciBnZW5lcmF0ZS5tYXRjaGVzLm1ybmEubm9HcywgZWNobz1GfQpzcGVjaWZpYy5tYXRjaGVzLm1ybmEubm9HcyA8LSB2ZWN0b3IoImxpc3QiLCAzKQpzcGVjaWZpYy5yZWd1bGF0b3J5Lm1hdGNoZXMubXJuYS5ub0dzIDwtIHZlY3RvcigibGlzdCIsIDMpCnVuc3BlY2lmaWMubWF0Y2hlcy5tcm5hLm5vR3MgPC0gdmVjdG9yKCJsaXN0IiwgMykKY29sdW1uX25hbWVzIDwtIGMoIjN1dHIiLCAiNXV0ciIsICJjb2RpbmciKQpmb3Ioc2IgaW4gMTozKXsKICBwcmludChwYXN0ZSgiQ29tcHV0aW5nIG1hdGNoZXMgZm9yICIsY29sdW1uX25hbWVzW3NiXSwiIHJlZ2lvbi4iLCBzZXA9IiIpKQogIHNwZWNpZmljLm1hdGNoZXMubXJuYS5ub0dzW1tzYl1dIDwtIHZlY3RvcigibGlzdCIsIDExKQogIGZvcihzIGluIDE6MTIpewogICAgcHJpbnQocGFzdGUoIiAgICBDb21wdXRpbmcgbWF0Y2hlcyBmb3IgaW50ZXJhY3Rpb24gbW90aWYgb2YgbGVuZ3RoICIsKHMrNyksIi4iLCBzZXA9IiIpKQogICAgc3BlY2lmaWMubWF0Y2hlcy5tcm5hLm5vR3NbW3NiXV1bW3NdXSA8LSBtYXRjaF9kYXRhW1ttcm5hXV1bW3NiXV1bLDJdICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3I6OnN0cl9leHRyYWN0X2FsbChpbnQubW90aWZzLm5vR3NbW3NdXSwgc2ltcGxpZnkgPSBGKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5vbWl0KCkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KCkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMudmVjdG9yKCkKICAgIHByaW50KHBhc3RlKCIgICAgQ29tcHV0aW5nIG1hdGNoZXMgZm9yIGludGVyYWN0aW9uIG1vdGlmIG9mIGxlbmd0aCAiLChzKzcpLCIgZW5kZWQuIiwgc2VwPSIiKSkKICB9CiAgdW5zcGVjaWZpYy5tYXRjaGVzLm1ybmEubm9Hc1tbc2JdXSA8LSBhcy52ZWN0b3IobmEub21pdCh1bmxpc3Qoc3RyaW5ncjo6c3RyX2V4dHJhY3RfYWxsKG1hdGNoX2RhdGFbW21ybmFdXVtbc2JdXVssMl0sIHRldHJhLm1vdGlmLjEwKSkpKQogIHByaW50KHBhc3RlKCJDb21wdXRpbmcgbWF0Y2hlcyBmb3IgdW5zcGVjaWZpYyB0ZXRyYW51Y2xlb3RpZGUgQ0NDQyBvciBUQ0NDQyBlbmRlZC4iLCBzZXA9IiIpKQp9CmBgYAoKCiMjIyAzLVVUUgpgYGB7ciBlY2hvPUZ9Cm1hdGNoZXMubXJuYS4zLnV0ciA8LSBhcy5kYXRhLmZyYW1lKHVubGlzdChzcGVjaWZpYy5tYXRjaGVzLm1ybmFbW3RocmVlX3V0cl1dKSkKY29sbmFtZXMobWF0Y2hlcy5tcm5hLjMudXRyKSA8LSAibWF0Y2hlcy5tcm5hLjMudXRyIgptYXRjaGVzLm1ybmEuMy51dHIKCiNEVDo6ZGF0YXRhYmxlKGFzLmRhdGEuZnJhbWUobWF0Y2hlcy5tcm5hLjMudXRyKSwgcm93bmFtZXMgPSBGLCBmaWx0ZXIgPSAndG9wJywgY2FwdGlvbiA9ICdUYWJsZSBvZiBhbGwgcmVndWxhdG9yeSBtb3RpZnMgYnkgbGVuZ3RoJywgZXh0ZW5zaW9ucyA9ICdCdXR0b25zJywgb3B0aW9ucyA9IGxpc3Qoc2Nyb2xsWCA9IFRSVUUsIGRvbSA9ICdCZnJ0aXAnLCBidXR0b25zID0gbGlzdChsaXN0KGV4dGVuZD0nY29weScsdGl0bGU9IlJlZ01vdGlmc0xpc3RCeUxlbmd0aCIpLGxpc3QoZXh0ZW5kPSdjc3YnLHRpdGxlPSJSZWdNb3RpZnNMaXN0QnlMZW5ndGgiKSxsaXN0KGV4dGVuZD0nZXhjZWwnLGZpbGVuYW1lPSJSZWdNb3RpZnNMaXN0QnlMZW5ndGgiKSxsaXN0KGV4dGVuZD0ncGRmJyxmaWxlbmFtZT0iUmVnTW90aWZzTGlzdEJ5TGVuZ3RoIiksbGlzdChleHRlbmQ9J3ByaW50JyxmaWxlbmFtZT0iUmVnTW90aWZzTGlzdEJ5TGVuZ3RoIikpLCBhdXRvV2lkdGggPSBUUlVFLCBwYWdlTGVuZ3RoID0gNSwgY29sdW1uRGVmcyA9IGxpc3QobGlzdChjbGFzc05hbWUgPSAnZHQtbGVmdCcpKSkpCgoKYGBgCgojIyMgMy1VVFIgKG5vIGNyaXRpY2FsIEdzKQpgYGB7ciBlY2hvPUZ9Cm1hdGNoZXMubXJuYS5ub0dzLjMudXRyIDwtIGFzLmRhdGEuZnJhbWUodW5saXN0KHNwZWNpZmljLm1hdGNoZXMubXJuYS5ub0dzW1t0aHJlZV91dHJdXSkpCmNvbG5hbWVzKG1hdGNoZXMubXJuYS5ub0dzLjMudXRyKSA8LSAibWF0Y2hlcy5tcm5hLm5vR3MuMy51dHIiCm1hdGNoZXMubXJuYS5ub0dzLjMudXRyCgojRFQ6OmRhdGF0YWJsZShhcy5kYXRhLmZyYW1lKG1hdGNoZXMubXJuYS5ub0dzLjMudXRyKSwgcm93bmFtZXMgPSBGLCBmaWx0ZXIgPSAndG9wJywgY2FwdGlvbiA9ICdUYWJsZSBvZiBhbGwgcmVndWxhdG9yeSBtb3RpZnMgYnkgbGVuZ3RoJywgZXh0ZW5zaW9ucyA9ICdCdXR0b25zJywgb3B0aW9ucyA9IGxpc3Qoc2Nyb2xsWCA9IFRSVUUsIGRvbSA9ICdCZnJ0aXAnLCBidXR0b25zID0gbGlzdChsaXN0KGV4dGVuZD0nY29weScsdGl0bGU9IlJlZ01vdGlmc0xpc3RCeUxlbmd0aCIpLGxpc3QoZXh0ZW5kPSdjc3YnLHRpdGxlPSJSZWdNb3RpZnNMaXN0QnlMZW5ndGgiKSxsaXN0KGV4dGVuZD0nZXhjZWwnLGZpbGVuYW1lPSJSZWdNb3RpZnNMaXN0QnlMZW5ndGgiKSxsaXN0KGV4dGVuZD0ncGRmJyxmaWxlbmFtZT0iUmVnTW90aWZzTGlzdEJ5TGVuZ3RoIiksbGlzdChleHRlbmQ9J3ByaW50JyxmaWxlbmFtZT0iUmVnTW90aWZzTGlzdEJ5TGVuZ3RoIikpLCBhdXRvV2lkdGggPSBUUlVFLCBwYWdlTGVuZ3RoID0gNSwgY29sdW1uRGVmcyA9IGxpc3QobGlzdChjbGFzc05hbWUgPSAnZHQtbGVmdCcpKSkpCgoKYGBgCgojIyMgNS1VVFIKYGBge3IgZWNobz1GfQptYXRjaGVzLm1ybmEuNS51dHIgPC0gYXMuZGF0YS5mcmFtZSh1bmxpc3Qoc3BlY2lmaWMubWF0Y2hlcy5tcm5hW1tmaXZlX3V0cl1dKSkKY29sbmFtZXMobWF0Y2hlcy5tcm5hLjUudXRyKSA8LSAibWF0Y2hlcy5tcm5hLjUudXRyIgptYXRjaGVzLm1ybmEuNS51dHIKYGBgCgojIyMgNS1VVFIgKG5vIGNyaXRpY2FsIEdzKQpgYGB7ciBlY2hvPUZ9Cm1hdGNoZXMubXJuYS5ub0dzLjUudXRyIDwtIGFzLmRhdGEuZnJhbWUodW5saXN0KHNwZWNpZmljLm1hdGNoZXMubXJuYS5ub0dzW1tmaXZlX3V0cl1dKSkKY29sbmFtZXMobWF0Y2hlcy5tcm5hLm5vR3MuNS51dHIpIDwtICJtYXRjaGVzLm1ybmEubm9Hcy41LnV0ciIKbWF0Y2hlcy5tcm5hLm5vR3MuNS51dHIKYGBgCgojIyMgQ0RTCmBgYHtyIGVjaG89Rn0KbWF0Y2hlcy5tcm5hLmNkcyA8LSBhcy5kYXRhLmZyYW1lKHVubGlzdChzcGVjaWZpYy5tYXRjaGVzLm1ybmFbW2Nkc11dKSkKY29sbmFtZXMobWF0Y2hlcy5tcm5hLmNkcykgPC0gIm1hdGNoZXMubXJuYS5jZHMiCm1hdGNoZXMubXJuYS5jZHMKYGBgCgojIyMgQ0RTIChubyBjcml0aWNhbCBHcykKYGBge3IgZWNobz1GfQptYXRjaGVzLm1ybmEubm9Hcy5jZHMgPC0gYXMuZGF0YS5mcmFtZSh1bmxpc3Qoc3BlY2lmaWMubWF0Y2hlcy5tcm5hLm5vR3NbW2Nkc11dKSkKY29sbmFtZXMobWF0Y2hlcy5tcm5hLm5vR3MuY2RzKSA8LSAibWF0Y2hlcy5tcm5hLm5vR3MuY2RzIgptYXRjaGVzLm1ybmEubm9Hcy5jZHMKYGBgCgoKYGBge3IgZ2VuZXJhdC5tYXRjaGVzLm5jcm5hLCBlY2hvPUZ9CnByaW50KHBhc3RlKCJDb21wdXRpbmcgbWF0Y2hlcyBmb3IgIixjb2x1bW5fbmFtZXNbc2JdLCIgcmVnaW9uLiIsIHNlcD0iIikpCnNwZWNpZmljLm1hdGNoZXMubmNybmEgPC0gdmVjdG9yKCJsaXN0IiwgMTEpCmZvcihzIGluIDE6MTIpewogICAgcHJpbnQocGFzdGUoIiAgICBDb21wdXRpbmcgbWF0Y2hlcyBmb3IgaW50ZXJhY3Rpb24gbW90aWYgb2YgbGVuZ3RoICIsKHMrNyksIi4iLCBzZXA9IiIpKQogICAgc3BlY2lmaWMubWF0Y2hlcy5uY3JuYVtbc11dIDwtIG1hdGNoX2RhdGFbW25jcm5hXV1bW3NiXV1bLDJdICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3I6OnN0cl9leHRyYWN0X2FsbChpbnQubW90aWZzW1tzXV0sIHNpbXBsaWZ5ID0gRikgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEub21pdCgpICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGlzdCgpICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLnZlY3RvcigpCiAgICBwcmludChwYXN0ZSgiICAgIENvbXB1dGluZyBtYXRjaGVzIGZvciBpbnRlcmFjdGlvbiBtb3RpZiBvZiBsZW5ndGggIiwocys3KSwiIGVuZGVkLiIsIHNlcD0iIikpCiAgfQogIHVuc3BlY2lmaWMubWF0Y2hlcy5uY3JuYSA8LSBhcy52ZWN0b3IobmEub21pdCh1bmxpc3Qoc3RyaW5ncjo6c3RyX2V4dHJhY3RfYWxsKG1hdGNoX2RhdGFbW25jcm5hXV1bW3NiXV1bLDJdLCB0ZXRyYS5tb3RpZi4xMCkpKSkKICBwcmludChwYXN0ZSgiQ29tcHV0aW5nIG1hdGNoZXMgZm9yIHVuc3BlY2lmaWMgdGV0cmFudWNsZW90aWRlIENDQ0Mgb3IgVENDQ0MgZW5kZWQuIiwgc2VwPSIiKSkKYGBgCgpgYGB7ciBnZW5lcmF0Lm1hdGNoZXMubmNybmEubm9HcywgZWNobz1GfQpwcmludChwYXN0ZSgiQ29tcHV0aW5nIG1hdGNoZXMgZm9yICIsY29sdW1uX25hbWVzW3NiXSwiIHJlZ2lvbi4iLCBzZXA9IiIpKQpzcGVjaWZpYy5tYXRjaGVzLm5jcm5hLm5vR3MgPC0gdmVjdG9yKCJsaXN0IiwgMTEpCmZvcihzIGluIDE6MTEpewogICAgcHJpbnQocGFzdGUoIiAgICBDb21wdXRpbmcgbWF0Y2hlcyBmb3IgaW50ZXJhY3Rpb24gbW90aWYgb2YgbGVuZ3RoICIsKHMrNyksIi4iLCBzZXA9IiIpKQogICAgc3BlY2lmaWMubWF0Y2hlcy5uY3JuYS5ub0dzW1tzXV0gPC0gbWF0Y2hfZGF0YVtbbmNybmFdXVtbc2JdXVssMl0gJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5ncjo6c3RyX2V4dHJhY3RfYWxsKGludC5tb3RpZnMubm9Hc1tbc11dLCBzaW1wbGlmeSA9IEYpICU+JSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLm9taXQoKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QoKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy52ZWN0b3IoKQogICAgcHJpbnQocGFzdGUoIiAgICBDb21wdXRpbmcgbWF0Y2hlcyBmb3IgaW50ZXJhY3Rpb24gbW90aWYgb2YgbGVuZ3RoICIsKHMrNyksIiBlbmRlZC4iLCBzZXA9IiIpKQogIH0KICB1bnNwZWNpZmljLm1hdGNoZXMubmNybmEubm9HcyA8LSBhcy52ZWN0b3IobmEub21pdCh1bmxpc3Qoc3RyaW5ncjo6c3RyX2V4dHJhY3RfYWxsKG1hdGNoX2RhdGFbW25jcm5hXV1bW3NiXV1bLDJdLCB0ZXRyYS5tb3RpZi4xMCkpKSkKICBwcmludChwYXN0ZSgiQ29tcHV0aW5nIG1hdGNoZXMgZm9yIHVuc3BlY2lmaWMgdGV0cmFudWNsZW90aWRlIENDQ0Mgb3IgVENDQ0MgZW5kZWQuIiwgc2VwPSIiKSkKYGBgCiMjIyBsbmNSTkEKYGBge3IgZWNobz1GfQptYXRjaGVzLm5jcm5hIDwtIGFzLmRhdGEuZnJhbWUodW5saXN0KHNwZWNpZmljLm1hdGNoZXMubmNybmEpKQpjb2xuYW1lcyhtYXRjaGVzLm5jcm5hKSA8LSAibWF0Y2hlcy5tcm5hLm5jcm5hIgptYXRjaGVzLm5jcm5hCmBgYAojIyMgbG5jUk5BIChubyBjcml0aWNhbCBHcykKYGBge3IgZWNobz1GfQptYXRjaGVzLm5jcm5hLm5vR3MgPC0gYXMuZGF0YS5mcmFtZSh1bmxpc3Qoc3BlY2lmaWMubWF0Y2hlcy5uY3JuYS5ub0dzKSkKY29sbmFtZXMobWF0Y2hlcy5uY3JuYS5ub0dzKSA8LSAibWF0Y2hlcy5tcm5hLm5jcm5hLm5vR3MiCm1hdGNoZXMubmNybmEubm9HcwpgYGAKCmBgYHtyIGVjaG89Rn0KYWxsLnNwZWNpZmljLm1hdGNoZXMubXJuYSA8LSB2ZWN0b3IoImxpc3QiLCAxMikKYWxsLnNwZWNpZmljLm1hdGNoZXMubXJuYS5ub0dzIDwtIHZlY3RvcigibGlzdCIsIDEyKQphbGwudW5zcGVjaWZpYy5tYXRjaGVzLm1ybmEgPC0gdmVjdG9yKCJsaXN0IiwgMTIpCmFsbC51bnNwZWNpZmljLm1hdGNoZXMubXJuYS5ub0dzICA8LSB2ZWN0b3IoImxpc3QiLCAxMikKZm9yKGwgaW4gMToxMil7CiAgYWxsLnNwZWNpZmljLm1hdGNoZXMubXJuYS5ub0dzW1tsXV0gPC0gYyhzcGVjaWZpYy5tYXRjaGVzLm1ybmEubm9Hc1tbdGhyZWVfdXRyXV1bW2xdXSwgc3BlY2lmaWMubWF0Y2hlcy5tcm5hLm5vR3NbW2ZpdmVfdXRyXV1bW2xdXSwgc3BlY2lmaWMubWF0Y2hlcy5tcm5hLm5vR3NbW2Nkc11dW1tsXV0pCiAgYWxsLnNwZWNpZmljLm1hdGNoZXMubXJuYVtbbF1dIDwtIGMoc3BlY2lmaWMubWF0Y2hlcy5tcm5hW1t0aHJlZV91dHJdXVtbbF1dLCBzcGVjaWZpYy5tYXRjaGVzLm1ybmFbW2ZpdmVfdXRyXV1bW2xdXSwgc3BlY2lmaWMubWF0Y2hlcy5tcm5hW1tjZHNdXVtbbF1dKQp9CmFsbC51bnNwZWNpZmljLm1hdGNoZXMubXJuYSA8LSBjKHVuc3BlY2lmaWMubWF0Y2hlcy5tcm5hW1t0aHJlZV91dHJdXSwgdW5zcGVjaWZpYy5tYXRjaGVzLm1ybmFbW2ZpdmVfdXRyXV0sIHVuc3BlY2lmaWMubWF0Y2hlcy5tcm5hW1tjZHNdXSkKYWxsLnVuc3BlY2lmaWMubWF0Y2hlcy5tcm5hLm5vR3MgPC0gYyh1bnNwZWNpZmljLm1hdGNoZXMubXJuYS5ub0dzW1t0aHJlZV91dHJdXSwgdW5zcGVjaWZpYy5tYXRjaGVzLm1ybmEubm9Hc1tbZml2ZV91dHJdXSwgdW5zcGVjaWZpYy5tYXRjaGVzLm1ybmEubm9Hc1tbY2RzXV0pCmBgYAoKIyMgey50YWJzZXQgLnRhYnNldC1mYWRlIH0KCjxoNCBpZD0iTG9nb3MiPjxhIGhyZWY9IiNiYWNrIj41LiBHZW5lcmF0aW9uIG9mIFNlcXVlbmNlIExvZ29zPC9hPjwvaDQ+Cgo8aDUgaWQ9IkxvZ29zSW50ZXJhY3Rpb24iPjxhIGhyZWY9IiNiYWNrIj41LjEgSW50ZXJhY3Rpb248L2E+PC9oND4KIyMjIEFsbCAoU3VtbWFyeSkKYGBge3IgbG9nby5mb3Iuc3BlY2lmaWMudGV0cmEuYWxsLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9MTAsIGVjaG89Rn0KcmVxdWlyZShnZ3Bsb3QyKQpyZXF1aXJlKGdnc2VxbG9nbykKbmNvbD0xCm1ldGhvZD0iYml0cyIKc2VwY2lmaWMubXJuYS5saXN0IDwtIChjKGFsbC5zcGVjaWZpYy5tYXRjaGVzLm1ybmEpKQp1bnNwZWNmaWMubXJuYS5saXN0IDwtIGxpc3QoYWxsLnVuc3BlY2lmaWMubWF0Y2hlcy5tcm5hKQpzdWIubXJuYS5sZWZ0IDwtIHVubGlzdChzZXBjaWZpYy5tcm5hLmxpc3QpCnN1Yi5tcm5hLmxlZnQgPC0gc3Vic3RyaW5nKHN1Yi5tcm5hLmxlZnQsIGZpcnN0ID0gMSwgbGFzdD0xNCkKc3ViLm1ybmEucmlnaHQgPC0gdW5saXN0KHNlcGNpZmljLm1ybmEubGlzdCkKc3ViLm1ybmEucmlnaHQgPC0gc3Vic3RyaW5nKHN1Yi5tcm5hLnJpZ2h0LCBmaXJzdCA9IG5jaGFyKHN1Yi5tcm5hLnJpZ2h0KS0xMywgbGFzdD1uY2hhcihzdWIubXJuYS5yaWdodCkpCnN1Yi5tcm5hLnVuc3BlY2lmaWMgPC0gYWxsLnVuc3BlY2lmaWMubWF0Y2hlcy5tcm5hCgoKc3ViLm1ybmEubGVmdCA8LSBsaXN0KHN1Yi5tcm5hLmxlZnQpCm5hbWVzKHN1Yi5tcm5hLmxlZnQpIDwtICJNb3RpZiBVcHN0cmVhbSIKc3ViLm1ybmEucmlnaHQgPC0gbGlzdChzdWIubXJuYS5yaWdodCkKbmFtZXMoc3ViLm1ybmEucmlnaHQpIDwtICJNb3RpZiBEb3duc3RyZWFtIgpzdWIubXJuYS51bnNwZWNpZmljIDwtIGxpc3Qoc3ViLm1ybmEudW5zcGVjaWZpYykKbmFtZXMoc3ViLm1ybmEudW5zcGVjaWZpYykgPC0gIlVuc3BlY2lmaWMgVGV0cmFudWNsZW90aWRlIChUQ0NDIG9yIENDQ0MpIFVwLSBhbmQgRG93bnN0cmVhbSIKCmdnc2wubXJuYS5sZWZ0IDwtIGdnc2VxbG9nbyhzdWIubXJuYS5sZWZ0LCBuY29sID0gbmNvbCwgbWV0aG9kPW1ldGhvZCkKZ2dzbC5tcm5hLnJpZ2h0IDwtIGdnc2VxbG9nbyhzdWIubXJuYS5yaWdodCwgbmNvbCA9IG5jb2wsIG1ldGhvZD1tZXRob2QpCmdnc2wubXJuYS51bnNwZWNpZmljIDwtIGdnc2VxbG9nbyhzdWIubXJuYS51bnNwZWNpZmljLCBuY29sID0gbmNvbCwgbWV0aG9kPW1ldGhvZCkKCmBgYApgYGB7ciBsb2dvLmZvci5zcGVjaWZpYy50ZXRyYS5hbGwubm9HcywgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTEwLCBlY2hvPUZ9CnJlcXVpcmUoZ2dwbG90MikKcmVxdWlyZShnZ3NlcWxvZ28pCmxpYnJhcnkoY293cGxvdCkKbmNvbD0xCm1ldGhvZD0iYml0cyIKc2VwY2lmaWMubXJuYS5ub0dzLmxpc3QgPC0gKGMoYWxsLnNwZWNpZmljLm1hdGNoZXMubXJuYS5ub0dzKSkKdW5zcGVjZmljLm1ybmEubm9Hcy5saXN0IDwtIGxpc3QoYWxsLnVuc3BlY2lmaWMubWF0Y2hlcy5tcm5hLm5vR3MpCnN1Yi5tcm5hLm5vR3MubGVmdCA8LSB1bmxpc3Qoc2VwY2lmaWMubXJuYS5ub0dzLmxpc3QpCnN1Yi5tcm5hLm5vR3MubGVmdCA8LSBzdWJzdHJpbmcoc3ViLm1ybmEubm9Hcy5sZWZ0LCBmaXJzdCA9IDEsIGxhc3Q9MTQpCnN1Yi5tcm5hLm5vR3MucmlnaHQgPC0gdW5saXN0KHNlcGNpZmljLm1ybmEubm9Hcy5saXN0KQpzdWIubXJuYS5ub0dzLnJpZ2h0IDwtIHN1YnN0cmluZyhzdWIubXJuYS5ub0dzLnJpZ2h0LCBmaXJzdCA9IG5jaGFyKHN1Yi5tcm5hLm5vR3MucmlnaHQpLTEzLCBsYXN0PW5jaGFyKHN1Yi5tcm5hLm5vR3MucmlnaHQpKQpzdWIubXJuYS51bnNwZWNpZmljIDwtIGFsbC51bnNwZWNpZmljLm1hdGNoZXMubXJuYQoKCnN1Yi5tcm5hLm5vR3MubGVmdCA8LSBsaXN0KHN1Yi5tcm5hLm5vR3MubGVmdCkKbmFtZXMoc3ViLm1ybmEubm9Hcy5sZWZ0KSA8LSAiTW90aWYgVXBzdHJlYW0iCnN1Yi5tcm5hLm5vR3MucmlnaHQgPC0gbGlzdChzdWIubXJuYS5ub0dzLnJpZ2h0KQpuYW1lcyhzdWIubXJuYS5ub0dzLnJpZ2h0KSA8LSAiTW90aWYgRG93bnN0cmVhbSIKc3ViLm1ybmEubm9Hcy51bnNwZWNpZmljIDwtIGxpc3Qoc3ViLm1ybmEudW5zcGVjaWZpYykKbmFtZXMoc3ViLm1ybmEubm9Hcy51bnNwZWNpZmljKSA8LSAiVW5zcGVjaWZpYyBUZXRyYW51Y2xlb3RpZGUgKFRDQ0Mgb3IgQ0NDQykgVXAtIGFuZCBEb3duc3RyZWFtIgoKZ2dzbC5tcm5hLm5vR3MubGVmdCA8LSBnZ3NlcWxvZ28oc3ViLm1ybmEubm9Hcy5sZWZ0LCBuY29sID0gbmNvbCwgbWV0aG9kPW1ldGhvZCkKZ2dzbC5tcm5hLm5vR3MucmlnaHQgPC0gZ2dzZXFsb2dvKHN1Yi5tcm5hLm5vR3MucmlnaHQsIG5jb2wgPSBuY29sLCBtZXRob2Q9bWV0aG9kKQpnZ3NsLm1ybmEubm9Hcy51bnNwZWNpZmljIDwtIGdnc2VxbG9nbyhzdWIubXJuYS51bnNwZWNpZmljLCBuY29sID0gbmNvbCwgbWV0aG9kPW1ldGhvZCkKCmNyaXRpY2FsUGxvdFRpdGxlIDwtIGdncGxvdCgpK2dndGl0bGUoIldpdGggY3JpdGljYWwgR3MiKSt0aGVtZV92b2lkKCkrdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgY29sb3VyID0gImRhcmtyZWQiKSkKbm9uQ3JpdGljYWxQbG90VGl0bGUgPC0gZ2dwbG90KCkrZ2d0aXRsZSgiV2l0aG91dCBjcml0aWNhbCBHcyIpK3RoZW1lX3ZvaWQoKSt0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBjb2xvdXIgPSAiZGFya3JlZCIpKQoKY3JpdGljYWxNb3RpZlBsb3QgPC0gcGxvdF9ncmlkKGdnc2wubXJuYS5sZWZ0LCBnZ3NsLm1ybmEucmlnaHQsbmNvbD0yKQpjcml0aWNhbFVuc3BlY1RldHJhUGxvdCA8LSBwbG90X2dyaWQoZ2dzbC5tcm5hLnVuc3BlY2lmaWMpCm5vbkNyaXRpY2FsTW90aWZQbG90IDwtIHBsb3RfZ3JpZChnZ3NsLm1ybmEubm9Hcy5sZWZ0LCBnZ3NsLm1ybmEubm9Hcy5yaWdodCxuY29sPTIpCm5vbkNyaXRpY2FsVW5zcGVjaWZpY1RldHJhUGxvdCA8LSBwbG90X2dyaWQoZ2dzbC5tcm5hLm5vR3MudW5zcGVjaWZpYykKCnBsb3RfZ3JpZChwbG90X2dyaWQocGxvdF9ncmlkKGNyaXRpY2FsUGxvdFRpdGxlLCBjcml0aWNhbE1vdGlmUGxvdCwgcmVsX2hlaWdodHMgPSBjKDEsMTApLCBuY29sPTEpLCBjcml0aWNhbFVuc3BlY1RldHJhUGxvdCwgbmNvbD0xKSwKICAgICAgICAgIHBsb3RfZ3JpZChwbG90X2dyaWQobm9uQ3JpdGljYWxQbG90VGl0bGUsIG5vbkNyaXRpY2FsTW90aWZQbG90LCByZWxfaGVpZ2h0cyA9IGMoMSwxMCksIG5jb2w9MSksIG5vbkNyaXRpY2FsVW5zcGVjaWZpY1RldHJhUGxvdCwgbmNvbD0xKSwgbmNvbD0yKQpgYGAKCiMjIyBBbGwgKERldGFpbGVkKQpgYGB7ciBmaWcuaGVpZ2h0PTM2LCBmaWcud2lkdGg9MTYsIGVjaG89Rn0KbGlicmFyeShnZ3NlcWxvZ28pCmxpYnJhcnkoY293cGxvdCkKbGVuZ3Rocy5ub0dzIDwtIHZlY3RvcigibGlzdCIsIDEyKQpmb3IobCBpbiAxOjEyKXsKIGxlbmd0aHMubm9Hc1tbbF1dIDwtIGxlbmd0aChhbGwuc3BlY2lmaWMubWF0Y2hlcy5tcm5hLm5vR3NbW2xdXSkKfQoKbGVuZ3RocyA8LSB2ZWN0b3IoImxpc3QiLCAxMikKZm9yKGwgaW4gMToxMil7CiBsZW5ndGhzW1tsXV0gPC0gbGVuZ3RoKGFsbC5zcGVjaWZpYy5tYXRjaGVzLm1ybmFbW2xdXSkKfQoKbGRmLm5vR3MgPC0gYXMuZGF0YS5mcmFtZSh1bmxpc3QobGVuZ3Rocy5ub0dzKSkKY29sbmFtZXMobGRmLm5vR3MpIDwtICJmcmVxdWVuY3kiCmxkZi5ub0dzJFR5cGUgPC0gIldpdGhvdXQgY3JpdGljYWwgRydzIgpsZGYubm9HcyRTVU0gPC0gc3VtKGxkZi5ub0dzJGZyZXF1ZW5jeSkKbGRmIDwtIGFzLmRhdGEuZnJhbWUodW5saXN0KGxlbmd0aHMpKQpjb2xuYW1lcyhsZGYpIDwtICJmcmVxdWVuY3kiCmxkZiRUeXBlIDwtICJXaXRoIGNyaXRpY2FsIEcncyIKbGRmJFNVTSA8LSBzdW0obGRmJGZyZXF1ZW5jeSkKbGRmJHBlcmMgPC0gcm91bmQoMTAwKmxkZiRmcmVxdWVuY3kvbGRmJFNVTSwgMikKbGRmLm5vR3MkcGVyYyA8LSByb3VuZCgxMDAqbGRmLm5vR3MkZnJlcXVlbmN5L2xkZi5ub0dzJFNVTSwgMikKCgoKbGlzdC5tcm5hLm5vR3MgPC0gYyhhbGwuc3BlY2lmaWMubWF0Y2hlcy5tcm5hLm5vR3MsIGxpc3QoYWxsLnVuc3BlY2lmaWMubWF0Y2hlcy5tcm5hLm5vR3MpKQpsaXN0Lm1ybmEgPC0gYyhhbGwuc3BlY2lmaWMubWF0Y2hlcy5tcm5hLCBsaXN0KGFsbC51bnNwZWNpZmljLm1hdGNoZXMubXJuYSkpCgpuYW1lcyhsaXN0Lm1ybmEubm9HcykgPC0gYyhwYXN0ZSgiTGVuZ3RoICIsODoxOSwiIC0gRnJlcXVlbmN5OiAiLCBsZGYubm9HcyRwZXJjLCIlIiwgc2VwPSIiKSwgIlVuc3BlY2lmaWMgVGV0cmFudWNsZW90aWRlIChUQ0NDIG9yIENDQ0MpIikKbmFtZXMobGlzdC5tcm5hKSA8LSBjKHBhc3RlKCJMZW5ndGggIiw4OjE5LCIgLSBGcmVxdWVuY3k6ICIsIGxkZiRwZXJjLCIlIiwgc2VwPSIiKSwgIlVuc3BlY2lmaWMgVGV0cmFudWNsZW90aWRlIChUQ0NDIG9yIENDQ0MpIikKbWV0aG9kPSJiaXQiCmdnc2wubXJuYS5ub0dzIDwtIGdnc2VxbG9nbyhsaXN0Lm1ybmEubm9HcywgbmNvbCA9IG5jb2wsIG1ldGhvZD1tZXRob2QpCmdnc2wubXJuYSA8LSBnZ3NlcWxvZ28obGlzdC5tcm5hLCBuY29sID0gbmNvbCwgbWV0aG9kPW1ldGhvZCkKCgpwbG90X2dyaWQocGxvdF9ncmlkKGNyaXRpY2FsUGxvdFRpdGxlLCBub25Dcml0aWNhbFBsb3RUaXRsZSwgbmNvbD0yKSwgcGxvdF9ncmlkKGdnc2wubXJuYSwgZ2dzbC5tcm5hLm5vR3MsIG5jb2w9MiksIHJlbF9oZWlnaHRzID0gYygwLjEsMTApLCBuY29sPTEpCgoKYGBgCgojIyMgMy1VVFIgKFN1bW1hcnkpCmBgYHtyIGxvZ28uZm9yLnNwZWNpZmljLnRldHJhLjMudXRyLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9MTAsIGVjaG89Rn0KcmVxdWlyZShnZ3Bsb3QyKQpyZXF1aXJlKGdnc2VxbG9nbykKbmNvbD0xCm1ldGhvZD0iYml0cyIKc2VwY2lmaWMubXJuYS5saXN0IDwtIChjKHNwZWNpZmljLm1hdGNoZXMubXJuYVtbdGhyZWVfdXRyXV0pKQp1bnNwZWNmaWMubXJuYS5saXN0IDwtIGxpc3QodW5zcGVjaWZpYy5tYXRjaGVzLm1ybmFbW3RocmVlX3V0cl1dKQpzdWIubXJuYS5sZWZ0IDwtIHVubGlzdChzZXBjaWZpYy5tcm5hLmxpc3QpCnN1Yi5tcm5hLmxlZnQgPC0gc3Vic3RyaW5nKHN1Yi5tcm5hLmxlZnQsIGZpcnN0ID0gMSwgbGFzdD0xNCkKc3ViLm1ybmEucmlnaHQgPC0gdW5saXN0KHNlcGNpZmljLm1ybmEubGlzdCkKc3ViLm1ybmEucmlnaHQgPC0gc3Vic3RyaW5nKHN1Yi5tcm5hLnJpZ2h0LCBmaXJzdCA9IG5jaGFyKHN1Yi5tcm5hLnJpZ2h0KS0xMywgbGFzdD1uY2hhcihzdWIubXJuYS5yaWdodCkpCnN1Yi5tcm5hLnVuc3BlY2lmaWMgPC0gdW5zcGVjaWZpYy5tYXRjaGVzLm1ybmFbW3RocmVlX3V0cl1dCgoKc3ViLm1ybmEubGVmdCA8LSBsaXN0KHN1Yi5tcm5hLmxlZnQpCm5hbWVzKHN1Yi5tcm5hLmxlZnQpIDwtICJNb3RpZiBVcHN0cmVhbSIKc3ViLm1ybmEucmlnaHQgPC0gbGlzdChzdWIubXJuYS5yaWdodCkKbmFtZXMoc3ViLm1ybmEucmlnaHQpIDwtICJNb3RpZiBEb3duc3RyZWFtIgpzdWIubXJuYS51bnNwZWNpZmljIDwtIGxpc3Qoc3ViLm1ybmEudW5zcGVjaWZpYykKbmFtZXMoc3ViLm1ybmEudW5zcGVjaWZpYykgPC0gIlVuc3BlY2lmaWMgVGV0cmFudWNsZW90aWRlIChUQ0NDIG9yIENDQ0MpIFVwLSBhbmQgRG93bnN0cmVhbSIKCmdnc2wubXJuYS5sZWZ0IDwtIGdnc2VxbG9nbyhzdWIubXJuYS5sZWZ0LCBuY29sID0gbmNvbCwgbWV0aG9kPW1ldGhvZCkKZ2dzbC5tcm5hLnJpZ2h0IDwtIGdnc2VxbG9nbyhzdWIubXJuYS5yaWdodCwgbmNvbCA9IG5jb2wsIG1ldGhvZD1tZXRob2QpCmdnc2wubXJuYS51bnNwZWNpZmljIDwtIGdnc2VxbG9nbyhzdWIubXJuYS51bnNwZWNpZmljLCBuY29sID0gbmNvbCwgbWV0aG9kPW1ldGhvZCkKCmBgYAoKYGBge3IgbG9nby5mb3Iuc3BlY2lmaWMudGV0cmEuMy51dHIubm9HcywgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTEwLCBlY2hvPUZ9CnJlcXVpcmUoZ2dwbG90MikKcmVxdWlyZShnZ3NlcWxvZ28pCmxpYnJhcnkoY293cGxvdCkKbmNvbD0xCm1ldGhvZD0iYml0cyIKc2VwY2lmaWMubXJuYS5ub0dzLmxpc3QgPC0gKGMoc3BlY2lmaWMubWF0Y2hlcy5tcm5hLm5vR3NbW3RocmVlX3V0cl1dKSkKdW5zcGVjZmljLm1ybmEubm9Hcy5saXN0IDwtIGxpc3QodW5zcGVjaWZpYy5tYXRjaGVzLm1ybmEubm9Hc1tbdGhyZWVfdXRyXV0pCnN1Yi5tcm5hLm5vR3MubGVmdCA8LSB1bmxpc3Qoc2VwY2lmaWMubXJuYS5ub0dzLmxpc3QpCnN1Yi5tcm5hLm5vR3MubGVmdCA8LSBzdWJzdHJpbmcoc3ViLm1ybmEubm9Hcy5sZWZ0LCBmaXJzdCA9IDEsIGxhc3Q9MTQpCnN1Yi5tcm5hLm5vR3MucmlnaHQgPC0gdW5saXN0KHNlcGNpZmljLm1ybmEubm9Hcy5saXN0KQpzdWIubXJuYS5ub0dzLnJpZ2h0IDwtIHN1YnN0cmluZyhzdWIubXJuYS5ub0dzLnJpZ2h0LCBmaXJzdCA9IG5jaGFyKHN1Yi5tcm5hLm5vR3MucmlnaHQpLTEzLCBsYXN0PW5jaGFyKHN1Yi5tcm5hLm5vR3MucmlnaHQpKQpzdWIubXJuYS51bnNwZWNpZmljIDwtIHVuc3BlY2lmaWMubWF0Y2hlcy5tcm5hW1t0aHJlZV91dHJdXQoKCnN1Yi5tcm5hLm5vR3MubGVmdCA8LSBsaXN0KHN1Yi5tcm5hLm5vR3MubGVmdCkKbmFtZXMoc3ViLm1ybmEubm9Hcy5sZWZ0KSA8LSAiTW90aWYgVXBzdHJlYW0iCnN1Yi5tcm5hLm5vR3MucmlnaHQgPC0gbGlzdChzdWIubXJuYS5ub0dzLnJpZ2h0KQpuYW1lcyhzdWIubXJuYS5ub0dzLnJpZ2h0KSA8LSAiTW90aWYgRG93bnN0cmVhbSIKc3ViLm1ybmEubm9Hcy51bnNwZWNpZmljIDwtIGxpc3Qoc3ViLm1ybmEudW5zcGVjaWZpYykKbmFtZXMoc3ViLm1ybmEubm9Hcy51bnNwZWNpZmljKSA8LSAiVW5zcGVjaWZpYyBUZXRyYW51Y2xlb3RpZGUgKFRDQ0Mgb3IgQ0NDQykgVXAtIGFuZCBEb3duc3RyZWFtIgoKZ2dzbC5tcm5hLm5vR3MubGVmdCA8LSBnZ3NlcWxvZ28oc3ViLm1ybmEubm9Hcy5sZWZ0LCBuY29sID0gbmNvbCwgbWV0aG9kPW1ldGhvZCkKZ2dzbC5tcm5hLm5vR3MucmlnaHQgPC0gZ2dzZXFsb2dvKHN1Yi5tcm5hLm5vR3MucmlnaHQsIG5jb2wgPSBuY29sLCBtZXRob2Q9bWV0aG9kKQpnZ3NsLm1ybmEubm9Hcy51bnNwZWNpZmljIDwtIGdnc2VxbG9nbyhzdWIubXJuYS51bnNwZWNpZmljLCBuY29sID0gbmNvbCwgbWV0aG9kPW1ldGhvZCkKCmNyaXRpY2FsUGxvdFRpdGxlIDwtIGdncGxvdCgpK2dndGl0bGUoIldpdGggY3JpdGljYWwgR3MiKSt0aGVtZV92b2lkKCkrdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgY29sb3VyID0gImRhcmtyZWQiKSkKbm9uQ3JpdGljYWxQbG90VGl0bGUgPC0gZ2dwbG90KCkrZ2d0aXRsZSgiV2l0aG91dCBjcml0aWNhbCBHcyIpK3RoZW1lX3ZvaWQoKSt0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBjb2xvdXIgPSAiZGFya3JlZCIpKQoKY3JpdGljYWxNb3RpZlBsb3QgPC0gcGxvdF9ncmlkKGdnc2wubXJuYS5sZWZ0LCBnZ3NsLm1ybmEucmlnaHQsbmNvbD0yKQpjcml0aWNhbFVuc3BlY1RldHJhUGxvdCA8LSBwbG90X2dyaWQoZ2dzbC5tcm5hLnVuc3BlY2lmaWMpCm5vbkNyaXRpY2FsTW90aWZQbG90IDwtIHBsb3RfZ3JpZChnZ3NsLm1ybmEubm9Hcy5sZWZ0LCBnZ3NsLm1ybmEubm9Hcy5yaWdodCxuY29sPTIpCm5vbkNyaXRpY2FsVW5zcGVjaWZpY1RldHJhUGxvdCA8LSBwbG90X2dyaWQoZ2dzbC5tcm5hLm5vR3MudW5zcGVjaWZpYykKCnBsb3RfZ3JpZChwbG90X2dyaWQocGxvdF9ncmlkKGNyaXRpY2FsUGxvdFRpdGxlLCBjcml0aWNhbE1vdGlmUGxvdCwgcmVsX2hlaWdodHMgPSBjKDEsMTApLCBuY29sPTEpLCBjcml0aWNhbFVuc3BlY1RldHJhUGxvdCwgbmNvbD0xKSwKICAgICAgICAgIHBsb3RfZ3JpZChwbG90X2dyaWQobm9uQ3JpdGljYWxQbG90VGl0bGUsIG5vbkNyaXRpY2FsTW90aWZQbG90LCByZWxfaGVpZ2h0cyA9IGMoMSwxMCksIG5jb2w9MSksIG5vbkNyaXRpY2FsVW5zcGVjaWZpY1RldHJhUGxvdCwgbmNvbD0xKSwgbmNvbD0yKQpgYGAKCiMjIyAzLVVUUiAoRGV0YWlsZWQpCmBgYHtyIGZpZy5oZWlnaHQ9MzYsIGZpZy53aWR0aD0xNiwgZWNobz1GfQpsaWJyYXJ5KGdnc2VxbG9nbykKbGlicmFyeShjb3dwbG90KQpsZW5ndGhzLm5vR3MgPC0gdmVjdG9yKCJsaXN0IiwgMTIpCmZvcihsIGluIDE6MTIpewogbGVuZ3Rocy5ub0dzW1tsXV0gPC0gbGVuZ3RoKHNwZWNpZmljLm1hdGNoZXMubXJuYS5ub0dzW1t0aHJlZV91dHJdXVtbbF1dKQp9CgpsZW5ndGhzIDwtIHZlY3RvcigibGlzdCIsIDEyKQpmb3IobCBpbiAxOjEyKXsKIGxlbmd0aHNbW2xdXSA8LSBsZW5ndGgoc3BlY2lmaWMubWF0Y2hlcy5tcm5hW1t0aHJlZV91dHJdXVtbbF1dKQp9CgpsZGYubm9HcyA8LSBhcy5kYXRhLmZyYW1lKHVubGlzdChsZW5ndGhzLm5vR3MpKQpjb2xuYW1lcyhsZGYubm9HcykgPC0gImZyZXF1ZW5jeSIKbGRmLm5vR3MkVHlwZSA8LSAiV2l0aG91dCBjcml0aWNhbCBHJ3MiCmxkZi5ub0dzJFNVTSA8LSBzdW0obGRmLm5vR3MkZnJlcXVlbmN5KQpsZGYgPC0gYXMuZGF0YS5mcmFtZSh1bmxpc3QobGVuZ3RocykpCmNvbG5hbWVzKGxkZikgPC0gImZyZXF1ZW5jeSIKbGRmJFR5cGUgPC0gIldpdGggY3JpdGljYWwgRydzIgpsZGYkU1VNIDwtIHN1bShsZGYkZnJlcXVlbmN5KQpsZGYkcGVyYyA8LSByb3VuZCgxMDAqbGRmJGZyZXF1ZW5jeS9sZGYkU1VNLCAyKQpsZGYubm9HcyRwZXJjIDwtIHJvdW5kKDEwMCpsZGYubm9HcyRmcmVxdWVuY3kvbGRmLm5vR3MkU1VNLCAyKQoKCgpsaXN0Lm1ybmEubm9HcyA8LSBjKHNwZWNpZmljLm1hdGNoZXMubXJuYS5ub0dzW1t0aHJlZV91dHJdXSwgbGlzdCh1bnNwZWNpZmljLm1hdGNoZXMubXJuYS5ub0dzW1t0aHJlZV91dHJdXSkpCmxpc3QubXJuYSA8LSBjKHNwZWNpZmljLm1hdGNoZXMubXJuYVtbdGhyZWVfdXRyXV0sIGxpc3QodW5zcGVjaWZpYy5tYXRjaGVzLm1ybmFbW3RocmVlX3V0cl1dKSkKCm5hbWVzKGxpc3QubXJuYS5ub0dzKSA8LSBjKHBhc3RlKCJMZW5ndGggIiw4OjE5LCIgLSBGcmVxdWVuY3k6ICIsIGxkZi5ub0dzJHBlcmMsIiUiLCBzZXA9IiIpLCAiVW5zcGVjaWZpYyBUZXRyYW51Y2xlb3RpZGUgKFRDQ0Mgb3IgQ0NDQykiKQpuYW1lcyhsaXN0Lm1ybmEpIDwtIGMocGFzdGUoIkxlbmd0aCAiLDg6MTksIiAtIEZyZXF1ZW5jeTogIiwgbGRmJHBlcmMsIiUiLCBzZXA9IiIpLCAiVW5zcGVjaWZpYyBUZXRyYW51Y2xlb3RpZGUgKFRDQ0Mgb3IgQ0NDQykiKQptZXRob2Q9ImJpdCIKZ2dzbC5tcm5hLm5vR3MgPC0gZ2dzZXFsb2dvKGxpc3QubXJuYS5ub0dzLCBuY29sID0gbmNvbCwgbWV0aG9kPW1ldGhvZCkKZ2dzbC5tcm5hIDwtIGdnc2VxbG9nbyhsaXN0Lm1ybmEsIG5jb2wgPSBuY29sLCBtZXRob2Q9bWV0aG9kKQoKCnBsb3RfZ3JpZChwbG90X2dyaWQoY3JpdGljYWxQbG90VGl0bGUsIG5vbkNyaXRpY2FsUGxvdFRpdGxlLCBuY29sPTIpLCBwbG90X2dyaWQoZ2dzbC5tcm5hLCBnZ3NsLm1ybmEubm9HcywgbmNvbD0yKSwgcmVsX2hlaWdodHMgPSBjKDAuMSwxMCksIG5jb2w9MSkKCgpgYGAKCgojIyMgNS1VVFIgKFN1bW1hcnkpCgpgYGB7ciBsb2dvLmZvci5zcGVjaWZpYy50ZXRyYS41LnV0ciwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTEwLCBlY2hvPUZ9CnJlcXVpcmUoZ2dwbG90MikKcmVxdWlyZShnZ3NlcWxvZ28pCgojIyMgRGV0YWlsZWQgdmVyc2lvbgpnZ3NsLm1ybmEgPC0gZ2dzZXFsb2dvKCBjKHNwZWNpZmljLm1hdGNoZXMubXJuYVtbZml2ZV91dHJdXSwgbGlzdCh1bnNwZWNpZmljLm1hdGNoZXMubXJuYVtbZml2ZV91dHJdXSkpLCBuY29sID0gbmNvbCwgbWV0aG9kPW1ldGhvZCkKZ2dzbC5tcm5hCgojIyMgV2l0aCBjcml0aWNhbCBHcwpuY29sPTEKbWV0aG9kPSJiaXRzIgpzZXBjaWZpYy5tcm5hLmZpdmVfdXRyLmxpc3QgPC0gKGMoc3BlY2lmaWMubWF0Y2hlcy5tcm5hW1tmaXZlX3V0cl1dKSkKc3ViLm1ybmEuZml2ZV91dHIubGVmdCA8LSB1bmxpc3Qoc2VwY2lmaWMubXJuYS5maXZlX3V0ci5saXN0KQpzdWIubXJuYS5maXZlX3V0ci5sZWZ0IDwtIHN1YnN0cmluZyhzdWIubXJuYS5maXZlX3V0ci5sZWZ0LCBmaXJzdCA9IDEsIGxhc3Q9MTQpCnN1Yi5tcm5hLmZpdmVfdXRyLnJpZ2h0IDwtIHVubGlzdChzZXBjaWZpYy5tcm5hLmZpdmVfdXRyLmxpc3QpCnN1Yi5tcm5hLmZpdmVfdXRyLnJpZ2h0IDwtIHN1YnN0cmluZyhzdWIubXJuYS5maXZlX3V0ci5yaWdodCwgZmlyc3QgPSBuY2hhcihzdWIubXJuYS5maXZlX3V0ci5yaWdodCktMTMsIGxhc3Q9bmNoYXIoc3ViLm1ybmEuZml2ZV91dHIucmlnaHQpKQpzdWIubXJuYS5maXZlX3V0ci51bnNwZWNpZmljIDwtICB1bnNwZWNpZmljLm1hdGNoZXMubXJuYVtbZml2ZV91dHJdXQoKc3ViLm1ybmEuZml2ZV91dHIubGVmdCA8LSBsaXN0KHN1Yi5tcm5hLmZpdmVfdXRyLmxlZnQpCm5hbWVzKHN1Yi5tcm5hLmZpdmVfdXRyLmxlZnQpIDwtICJNb3RpZiBVcHN0cmVhbSIKc3ViLm1ybmEuZml2ZV91dHIucmlnaHQgPC0gbGlzdChzdWIubXJuYS5maXZlX3V0ci5yaWdodCkKbmFtZXMoc3ViLm1ybmEuZml2ZV91dHIucmlnaHQpIDwtICJNb3RpZiBEb3duc3RyZWFtIgpzdWIubXJuYS5maXZlX3V0ci51bnNwZWNpZmljIDwtIGxpc3Qoc3ViLm1ybmEuZml2ZV91dHIudW5zcGVjaWZpYykKbmFtZXMoc3ViLm1ybmEuZml2ZV91dHIudW5zcGVjaWZpYykgPC0gIlVuc3BlY2lmaWMgVGV0cmFudWNsZW90aWRlIChUQ0NDIG9yIENDQ0MpIFVwLSBhbmQgRG93bnN0cmVhbSIKCiMjIyBDcmVhdGUgcGxvdHMKZ2dzbC5tcm5hLmZpdmVfdXRyLmxlZnQgPC0gZ2dzZXFsb2dvKHN1Yi5tcm5hLmZpdmVfdXRyLmxlZnQsIG5jb2wgPSBuY29sLCBtZXRob2Q9bWV0aG9kKQpnZ3NsLm1ybmEuZml2ZV91dHIucmlnaHQgPC0gZ2dzZXFsb2dvKHN1Yi5tcm5hLmZpdmVfdXRyLnJpZ2h0LCBuY29sID0gbmNvbCwgbWV0aG9kPW1ldGhvZCkKZ2dzbC5tcm5hLmZpdmVfdXRyLnVuc3BlY2lmaWMgPC0gZ2dzZXFsb2dvKHN1Yi5tcm5hLmZpdmVfdXRyLnVuc3BlY2lmaWMsIG5jb2wgPSBuY29sLCBtZXRob2Q9bWV0aG9kKQoKIyMjIFdpdGhvdXQgY3JpdGljYWwgR3MKc2VwY2lmaWMubXJuYS5ub0dzLmZpdmVfdXRyLmxpc3QgPC0gKGMoc3BlY2lmaWMubWF0Y2hlcy5tcm5hLm5vR3NbW2ZpdmVfdXRyXV0pKQpzdWIubXJuYS5ub0dzLmZpdmVfdXRyLmxlZnQgPC0gdW5saXN0KHNlcGNpZmljLm1ybmEubm9Hcy5maXZlX3V0ci5saXN0KQpzdWIubXJuYS5ub0dzLmZpdmVfdXRyLmxlZnQgPC0gc3Vic3RyaW5nKHN1Yi5tcm5hLm5vR3MuZml2ZV91dHIubGVmdCwgZmlyc3QgPSAxLCBsYXN0PTE0KQpzdWIubXJuYS5ub0dzLmZpdmVfdXRyLnJpZ2h0IDwtIHVubGlzdChzZXBjaWZpYy5tcm5hLm5vR3MuZml2ZV91dHIubGlzdCkKc3ViLm1ybmEubm9Hcy5maXZlX3V0ci5yaWdodCA8LSBzdWJzdHJpbmcoc3ViLm1ybmEubm9Hcy5maXZlX3V0ci5yaWdodCwgZmlyc3QgPSBuY2hhcihzdWIubXJuYS5ub0dzLmZpdmVfdXRyLnJpZ2h0KS0xMywgbGFzdD1uY2hhcihzdWIubXJuYS5ub0dzLmZpdmVfdXRyLnJpZ2h0KSkKc3ViLm1ybmEubm9Hcy5maXZlX3V0ci51bnNwZWNpZmljIDwtICB1bnNwZWNpZmljLm1hdGNoZXMubXJuYS5ub0dzW1tmaXZlX3V0cl1dCgpzdWIubXJuYS5ub0dzLmZpdmVfdXRyLmxlZnQgPC0gbGlzdChzdWIubXJuYS5ub0dzLmZpdmVfdXRyLmxlZnQpCm5hbWVzKHN1Yi5tcm5hLm5vR3MuZml2ZV91dHIubGVmdCkgPC0gIk1vdGlmIFVwc3RyZWFtIgpzdWIubXJuYS5ub0dzLmZpdmVfdXRyLnJpZ2h0IDwtIGxpc3Qoc3ViLm1ybmEubm9Hcy5maXZlX3V0ci5yaWdodCkKbmFtZXMoc3ViLm1ybmEubm9Hcy5maXZlX3V0ci5yaWdodCkgPC0gIk1vdGlmIERvd25zdHJlYW0iCnN1Yi5tcm5hLm5vR3MuZml2ZV91dHIudW5zcGVjaWZpYyA8LSBsaXN0KHN1Yi5tcm5hLm5vR3MuZml2ZV91dHIudW5zcGVjaWZpYykKbmFtZXMoc3ViLm1ybmEubm9Hcy5maXZlX3V0ci51bnNwZWNpZmljKSA8LSAiVW5zcGVjaWZpYyBUZXRyYW51Y2xlb3RpZGUgKFRDQ0Mgb3IgQ0NDQykgVXAtIGFuZCBEb3duc3RyZWFtIgoKIyMjIENyZWF0ZSBwbG90cwpnZ3NsLm1ybmEubm9Hcy5maXZlX3V0ci5sZWZ0IDwtIGdnc2VxbG9nbyhzdWIubXJuYS5ub0dzLmZpdmVfdXRyLmxlZnQsIG5jb2wgPSBuY29sLCBtZXRob2Q9bWV0aG9kKQpnZ3NsLm1ybmEubm9Hcy5maXZlX3V0ci5yaWdodCA8LSBnZ3NlcWxvZ28oc3ViLm1ybmEubm9Hcy5maXZlX3V0ci5yaWdodCwgbmNvbCA9IG5jb2wsIG1ldGhvZD1tZXRob2QpCmdnc2wubXJuYS5ub0dzLmZpdmVfdXRyLnVuc3BlY2lmaWMgPC0gZ2dzZXFsb2dvKHN1Yi5tcm5hLm5vR3MuZml2ZV91dHIudW5zcGVjaWZpYywgbmNvbCA9IG5jb2wsIG1ldGhvZD1tZXRob2QpCgojIyMgU2hvdCBwbG90cyBncmlkLgpsaWJyYXJ5KGNvd3Bsb3QpCmNyaXRpY2FsTW90aWZQbG90IDwtIHBsb3RfZ3JpZChnZ3NsLm1ybmEuZml2ZV91dHIubGVmdCwgZ2dzbC5tcm5hLmZpdmVfdXRyLnJpZ2h0LG5jb2w9MikKY3JpdGljYWxVbnNwZWNUZXRyYVBsb3QgPC0gcGxvdF9ncmlkKGdnc2wubXJuYS5maXZlX3V0ci51bnNwZWNpZmljKQpub25Dcml0aWNhbE1vdGlmUGxvdCA8LSBwbG90X2dyaWQoZ2dzbC5tcm5hLm5vR3MuZml2ZV91dHIubGVmdCwgZ2dzbC5tcm5hLm5vR3MuZml2ZV91dHIucmlnaHQsbmNvbD0yKQpub25Dcml0aWNhbFVuc3BlY2lmaWNUZXRyYVBsb3QgPC0gcGxvdF9ncmlkKGdnc2wubXJuYS5ub0dzLmZpdmVfdXRyLnVuc3BlY2lmaWMpCgpwbG90X2dyaWQocGxvdF9ncmlkKHBsb3RfZ3JpZChjcml0aWNhbFBsb3RUaXRsZSwgY3JpdGljYWxNb3RpZlBsb3QsIHJlbF9oZWlnaHRzID0gYygxLDEwKSwgbmNvbD0xKSwgY3JpdGljYWxVbnNwZWNUZXRyYVBsb3QsIG5jb2w9MSksCiAgICAgICAgICBwbG90X2dyaWQocGxvdF9ncmlkKG5vbkNyaXRpY2FsUGxvdFRpdGxlLCBub25Dcml0aWNhbE1vdGlmUGxvdCwgcmVsX2hlaWdodHMgPSBjKDEsMTApLCBuY29sPTEpLCBub25Dcml0aWNhbFVuc3BlY2lmaWNUZXRyYVBsb3QsIG5jb2w9MSksIG5jb2w9MikKCmBgYAoKIyMjIDUtVVRSIChEZXRhaWxlZCkKYGBge3IgZmlnLmhlaWdodD0zNiwgZmlnLndpZHRoPTE2LCBlY2hvPUZ9CmxpYnJhcnkoZ2dzZXFsb2dvKQpsaWJyYXJ5KGNvd3Bsb3QpCmxlbmd0aHMubm9HcyA8LSB2ZWN0b3IoImxpc3QiLCAxMikKZm9yKGwgaW4gMToxMil7CiBsZW5ndGhzLm5vR3NbW2xdXSA8LSBsZW5ndGgoc3BlY2lmaWMubWF0Y2hlcy5tcm5hLm5vR3NbW2ZpdmVfdXRyXV1bW2xdXSkKfQoKbGVuZ3RocyA8LSB2ZWN0b3IoImxpc3QiLCAxMikKZm9yKGwgaW4gMToxMil7CiBsZW5ndGhzW1tsXV0gPC0gbGVuZ3RoKHNwZWNpZmljLm1hdGNoZXMubXJuYVtbZml2ZV91dHJdXVtbbF1dKQp9CgpsZGYubm9HcyA8LSBhcy5kYXRhLmZyYW1lKHVubGlzdChsZW5ndGhzLm5vR3MpKQpjb2xuYW1lcyhsZGYubm9HcykgPC0gImZyZXF1ZW5jeSIKbGRmLm5vR3MkVHlwZSA8LSAiV2l0aG91dCBjcml0aWNhbCBHJ3MiCmxkZi5ub0dzJFNVTSA8LSBzdW0obGRmLm5vR3MkZnJlcXVlbmN5KQpsZGYgPC0gYXMuZGF0YS5mcmFtZSh1bmxpc3QobGVuZ3RocykpCmNvbG5hbWVzKGxkZikgPC0gImZyZXF1ZW5jeSIKbGRmJFR5cGUgPC0gIldpdGggY3JpdGljYWwgRydzIgpsZGYkU1VNIDwtIHN1bShsZGYkZnJlcXVlbmN5KQpsZGYkcGVyYyA8LSByb3VuZCgxMDAqbGRmJGZyZXF1ZW5jeS9sZGYkU1VNLCAyKQpsZGYubm9HcyRwZXJjIDwtIHJvdW5kKDEwMCpsZGYubm9HcyRmcmVxdWVuY3kvbGRmLm5vR3MkU1VNLCAyKQoKCgpsaXN0Lm1ybmEubm9HcyA8LSBjKHNwZWNpZmljLm1hdGNoZXMubXJuYS5ub0dzW1tmaXZlX3V0cl1dLCBsaXN0KHVuc3BlY2lmaWMubWF0Y2hlcy5tcm5hLm5vR3NbW2ZpdmVfdXRyXV0pKQpsaXN0Lm1ybmEgPC0gYyhzcGVjaWZpYy5tYXRjaGVzLm1ybmFbW2ZpdmVfdXRyXV0sIGxpc3QodW5zcGVjaWZpYy5tYXRjaGVzLm1ybmFbW2ZpdmVfdXRyXV0pKQoKbmFtZXMobGlzdC5tcm5hLm5vR3MpIDwtIGMocGFzdGUoIkxlbmd0aCAiLDg6MTksIiAtIEZyZXF1ZW5jeTogIiwgbGRmLm5vR3MkcGVyYywiJSIsIHNlcD0iIiksICJVbnNwZWNpZmljIFRldHJhbnVjbGVvdGlkZSAoVENDQyBvciBDQ0NDKSIpCm5hbWVzKGxpc3QubXJuYSkgPC0gYyhwYXN0ZSgiTGVuZ3RoICIsODoxOSwiIC0gRnJlcXVlbmN5OiAiLCBsZGYkcGVyYywiJSIsIHNlcD0iIiksICJVbnNwZWNpZmljIFRldHJhbnVjbGVvdGlkZSAoVENDQyBvciBDQ0NDKSIpCm1ldGhvZD0iYml0IgpnZ3NsLm1ybmEubm9HcyA8LSBnZ3NlcWxvZ28obGlzdC5tcm5hLm5vR3MsIG5jb2wgPSBuY29sLCBtZXRob2Q9bWV0aG9kKQpnZ3NsLm1ybmEgPC0gZ2dzZXFsb2dvKGxpc3QubXJuYSwgbmNvbCA9IG5jb2wsIG1ldGhvZD1tZXRob2QpCgoKcGxvdF9ncmlkKHBsb3RfZ3JpZChjcml0aWNhbFBsb3RUaXRsZSwgbm9uQ3JpdGljYWxQbG90VGl0bGUsIG5jb2w9MiksIHBsb3RfZ3JpZChnZ3NsLm1ybmEsIGdnc2wubXJuYS5ub0dzLCBuY29sPTIpLCByZWxfaGVpZ2h0cyA9IGMoMC4xLDEwKSwgbmNvbD0xKQoKCmBgYAoKCgojIyMgQ0RTIChTdW1tYXJ5KQpgYGB7ciBsb2dvLmZvci5zcGVjaWZpYy50ZXRyYS5jZHMsIGZpZy53aWR0aD0xNSwgZmlnLmhlaWdodD0xMCwgZWNobz1GfQpyZXF1aXJlKGdncGxvdDIpCnJlcXVpcmUoZ2dzZXFsb2dvKQpuY29sPTEKbWV0aG9kPSJiaXQiCgojIyMgV2l0aCBjcml0aWNhbCBHcwpzZXBjaWZpYy5tcm5hLmNkcy5saXN0IDwtIChjKHNwZWNpZmljLm1hdGNoZXMubXJuYVtbY2RzXV0pKQpzdWIubXJuYS5jZHMubGVmdCA8LSB1bmxpc3Qoc2VwY2lmaWMubXJuYS5jZHMubGlzdCkKc3ViLm1ybmEuY2RzLmxlZnQgPC0gc3Vic3RyaW5nKHN1Yi5tcm5hLmNkcy5sZWZ0LCBmaXJzdCA9IDEsIGxhc3Q9MTQpCnN1Yi5tcm5hLmNkcy5yaWdodCA8LSB1bmxpc3Qoc2VwY2lmaWMubXJuYS5jZHMubGlzdCkKc3ViLm1ybmEuY2RzLnJpZ2h0IDwtIHN1YnN0cmluZyhzdWIubXJuYS5jZHMucmlnaHQsIGZpcnN0ID0gbmNoYXIoc3ViLm1ybmEuY2RzLnJpZ2h0KS0xMywgbGFzdD1uY2hhcihzdWIubXJuYS5jZHMucmlnaHQpKQpzdWIubXJuYS5jZHMudW5zcGVjaWZpYyA8LSAgdW5zcGVjaWZpYy5tYXRjaGVzLm1ybmFbW2Nkc11dCgpzdWIubXJuYS5jZHMubGVmdCA8LSBsaXN0KHN1Yi5tcm5hLmNkcy5sZWZ0KQpuYW1lcyhzdWIubXJuYS5jZHMubGVmdCkgPC0gIk1vdGlmIFVwc3RyZWFtIgpzdWIubXJuYS5jZHMucmlnaHQgPC0gbGlzdChzdWIubXJuYS5jZHMucmlnaHQpCm5hbWVzKHN1Yi5tcm5hLmNkcy5yaWdodCkgPC0gIk1vdGlmIERvd25zdHJlYW0iCnN1Yi5tcm5hLmNkcy51bnNwZWNpZmljIDwtIGxpc3Qoc3ViLm1ybmEuY2RzLnVuc3BlY2lmaWMpCm5hbWVzKHN1Yi5tcm5hLmNkcy51bnNwZWNpZmljKSA8LSAiVW5zcGVjaWZpYyBUZXRyYW51Y2xlb3RpZGUgKFRDQ0Mgb3IgQ0NDQykgVXAtIGFuZCBEb3duc3RyZWFtIgoKZ2dzbC5tcm5hLmNkcy5sZWZ0IDwtIGdnc2VxbG9nbyhzdWIubXJuYS5jZHMubGVmdCwgbmNvbCA9IG5jb2wsIG1ldGhvZD1tZXRob2QpCmdnc2wubXJuYS5jZHMucmlnaHQgPC0gZ2dzZXFsb2dvKHN1Yi5tcm5hLmNkcy5yaWdodCwgbmNvbCA9IG5jb2wsIG1ldGhvZD1tZXRob2QpCmdnc2wubXJuYS5jZHMudW5zcGVjaWZpYyA8LSBnZ3NlcWxvZ28oc3ViLm1ybmEuY2RzLnVuc3BlY2lmaWMsIG5jb2wgPSBuY29sLCBtZXRob2Q9bWV0aG9kKQoKIyMjIFdpdGhvdXQgY3JpdGljYWwgRydzCnNlcGNpZmljLm1ybmEubm9Hcy5jZHMubGlzdCA8LSAoYyhzcGVjaWZpYy5tYXRjaGVzLm1ybmEubm9Hc1tbY2RzXV0pKQpzdWIubXJuYS5ub0dzLmNkcy5sZWZ0IDwtIHVubGlzdChzZXBjaWZpYy5tcm5hLm5vR3MuY2RzLmxpc3QpCnN1Yi5tcm5hLm5vR3MuY2RzLmxlZnQgPC0gc3Vic3RyaW5nKHN1Yi5tcm5hLm5vR3MuY2RzLmxlZnQsIGZpcnN0ID0gMSwgbGFzdD0xNCkKc3ViLm1ybmEubm9Hcy5jZHMucmlnaHQgPC0gdW5saXN0KHNlcGNpZmljLm1ybmEubm9Hcy5jZHMubGlzdCkKc3ViLm1ybmEubm9Hcy5jZHMucmlnaHQgPC0gc3Vic3RyaW5nKHN1Yi5tcm5hLm5vR3MuY2RzLnJpZ2h0LCBmaXJzdCA9IG5jaGFyKHN1Yi5tcm5hLm5vR3MuY2RzLnJpZ2h0KS0xMywgbGFzdD1uY2hhcihzdWIubXJuYS5ub0dzLmNkcy5yaWdodCkpCnN1Yi5tcm5hLm5vR3MuY2RzLnVuc3BlY2lmaWMgPC0gIHVuc3BlY2lmaWMubWF0Y2hlcy5tcm5hLm5vR3NbW2Nkc11dCgpzdWIubXJuYS5ub0dzLmNkcy5sZWZ0IDwtIGxpc3Qoc3ViLm1ybmEubm9Hcy5jZHMubGVmdCkKbmFtZXMoc3ViLm1ybmEubm9Hcy5jZHMubGVmdCkgPC0gIk1vdGlmIFVwc3RyZWFtIgpzdWIubXJuYS5ub0dzLmNkcy5yaWdodCA8LSBsaXN0KHN1Yi5tcm5hLm5vR3MuY2RzLnJpZ2h0KQpuYW1lcyhzdWIubXJuYS5ub0dzLmNkcy5yaWdodCkgPC0gIk1vdGlmIERvd25zdHJlYW0iCnN1Yi5tcm5hLm5vR3MuY2RzLnVuc3BlY2lmaWMgPC0gbGlzdChzdWIubXJuYS5ub0dzLmNkcy51bnNwZWNpZmljKQpuYW1lcyhzdWIubXJuYS5ub0dzLmNkcy51bnNwZWNpZmljKSA8LSAiVW5zcGVjaWZpYyBUZXRyYW51Y2xlb3RpZGUgKFRDQ0Mgb3IgQ0NDQykgVXAtIGFuZCBEb3duc3RyZWFtIgoKZ2dzbC5tcm5hLm5vR3MuY2RzLmxlZnQgPC0gZ2dzZXFsb2dvKHN1Yi5tcm5hLm5vR3MuY2RzLmxlZnQsIG5jb2wgPSBuY29sLCBtZXRob2Q9bWV0aG9kKQpnZ3NsLm1ybmEubm9Hcy5jZHMucmlnaHQgPC0gZ2dzZXFsb2dvKHN1Yi5tcm5hLm5vR3MuY2RzLnJpZ2h0LCBuY29sID0gbmNvbCwgbWV0aG9kPW1ldGhvZCkKZ2dzbC5tcm5hLm5vR3MuY2RzLnVuc3BlY2lmaWMgPC0gZ2dzZXFsb2dvKHN1Yi5tcm5hLm5vR3MuY2RzLnVuc3BlY2lmaWMsIG5jb2wgPSBuY29sLCBtZXRob2Q9bWV0aG9kKQoKcGxvdF9ncmlkKHBsb3RfZ3JpZChwbG90X2dyaWQoZ2dzbC5tcm5hLmNkcy5sZWZ0LCBnZ3NsLm1ybmEuY2RzLnJpZ2h0LG5jb2w9MiksIHBsb3RfZ3JpZChnZ3NsLm1ybmEuY2RzLnVuc3BlY2lmaWMpLCBuY29sPTEpLApwbG90X2dyaWQocGxvdF9ncmlkKGdnc2wubXJuYS5ub0dzLmNkcy5sZWZ0LCBnZ3NsLm1ybmEubm9Hcy5jZHMucmlnaHQsbmNvbD0yKSwgcGxvdF9ncmlkKGdnc2wubXJuYS5ub0dzLmNkcy51bnNwZWNpZmljKSwgbmNvbD0xKSwgbmNvbD0yKQoKCgpjcml0aWNhbE1vdGlmUGxvdCA8LSBwbG90X2dyaWQoZ2dzbC5tcm5hLmNkcy5sZWZ0LCBnZ3NsLm1ybmEuY2RzLnJpZ2h0LG5jb2w9MikKY3JpdGljYWxVbnNwZWNUZXRyYVBsb3QgPC0gcGxvdF9ncmlkKGdnc2wubXJuYS5jZHMudW5zcGVjaWZpYykKbm9uQ3JpdGljYWxNb3RpZlBsb3QgPC0gcGxvdF9ncmlkKGdnc2wubXJuYS5ub0dzLmNkcy5sZWZ0LCBnZ3NsLm1ybmEubm9Hcy5jZHMucmlnaHQsbmNvbD0yKQpub25Dcml0aWNhbFVuc3BlY2lmaWNUZXRyYVBsb3QgPC0gcGxvdF9ncmlkKGdnc2wubXJuYS5ub0dzLmNkcy51bnNwZWNpZmljKQoKCmxpYnJhcnkoY293cGxvdCkKcGxvdF9ncmlkKHBsb3RfZ3JpZChwbG90X2dyaWQoY3JpdGljYWxQbG90VGl0bGUsIGNyaXRpY2FsTW90aWZQbG90LCByZWxfaGVpZ2h0cyA9IGMoMSwxMCksIG5jb2w9MSksIGNyaXRpY2FsVW5zcGVjVGV0cmFQbG90LCBuY29sPTEpLAogICAgICAgICAgcGxvdF9ncmlkKHBsb3RfZ3JpZChub25Dcml0aWNhbFBsb3RUaXRsZSwgbm9uQ3JpdGljYWxNb3RpZlBsb3QsIHJlbF9oZWlnaHRzID0gYygxLDEwKSwgbmNvbD0xKSwgbm9uQ3JpdGljYWxVbnNwZWNpZmljVGV0cmFQbG90LCBuY29sPTEpLCBuY29sPTIpCgpgYGAKCiMjIyBDRFMgKERldGFpbGVkKQpgYGB7ciBmaWcuaGVpZ2h0PTM2LCBmaWcud2lkdGg9MTYsIGVjaG89Rn0KCmxlbmd0aHMubm9HcyA8LSB2ZWN0b3IoImxpc3QiLCAxMikKZm9yKGwgaW4gMToxMil7CiBsZW5ndGhzLm5vR3NbW2xdXSA8LSBsZW5ndGgoc3BlY2lmaWMubWF0Y2hlcy5tcm5hLm5vR3NbW2Nkc11dW1tsXV0pCn0KCmxlbmd0aHMgPC0gdmVjdG9yKCJsaXN0IiwgMTIpCmZvcihsIGluIDE6MTIpewogbGVuZ3Roc1tbbF1dIDwtIGxlbmd0aChzcGVjaWZpYy5tYXRjaGVzLm1ybmFbW2Nkc11dW1tsXV0pCn0KCmxkZi5ub0dzIDwtIGFzLmRhdGEuZnJhbWUodW5saXN0KGxlbmd0aHMubm9HcykpCmNvbG5hbWVzKGxkZi5ub0dzKSA8LSAiZnJlcXVlbmN5IgpsZGYubm9HcyRUeXBlIDwtICJXaXRob3V0IGNyaXRpY2FsIEcncyIKbGRmLm5vR3MkU1VNIDwtIHN1bShsZGYubm9HcyRmcmVxdWVuY3kpCmxkZiA8LSBhcy5kYXRhLmZyYW1lKHVubGlzdChsZW5ndGhzKSkKY29sbmFtZXMobGRmKSA8LSAiZnJlcXVlbmN5IgpsZGYkVHlwZSA8LSAiV2l0aCBjcml0aWNhbCBHJ3MiCmxkZiRTVU0gPC0gc3VtKGxkZiRmcmVxdWVuY3kpCmxkZiRwZXJjIDwtIHJvdW5kKDEwMCpsZGYkZnJlcXVlbmN5L2xkZiRTVU0sIDIpCmxkZi5ub0dzJHBlcmMgPC0gcm91bmQoMTAwKmxkZi5ub0dzJGZyZXF1ZW5jeS9sZGYubm9HcyRTVU0sIDIpCgoKCmxpc3QubXJuYS5ub0dzIDwtIGMoc3BlY2lmaWMubWF0Y2hlcy5tcm5hLm5vR3NbW2Nkc11dLCBsaXN0KHVuc3BlY2lmaWMubWF0Y2hlcy5tcm5hLm5vR3NbW2Nkc11dKSkKbGlzdC5tcm5hIDwtIGMoc3BlY2lmaWMubWF0Y2hlcy5tcm5hW1tjZHNdXSwgbGlzdCh1bnNwZWNpZmljLm1hdGNoZXMubXJuYVtbY2RzXV0pKQoKbmFtZXMobGlzdC5tcm5hLm5vR3MpIDwtIGMocGFzdGUoIkxlbmd0aCAiLDg6MTksIiAtIEZyZXF1ZW5jeTogIiwgbGRmLm5vR3MkcGVyYywiJSIsIHNlcD0iIiksICJVbnNwZWNpZmljIFRldHJhbnVjbGVvdGlkZSAoVENDQyBvciBDQ0NDKSIpCm5hbWVzKGxpc3QubXJuYSkgPC0gYyhwYXN0ZSgiTGVuZ3RoICIsODoxOSwiIC0gRnJlcXVlbmN5OiAiLCBsZGYkcGVyYywiJSIsIHNlcD0iIiksICJVbnNwZWNpZmljIFRldHJhbnVjbGVvdGlkZSAoVENDQyBvciBDQ0NDKSIpCgpnZ3NsLm1ybmEubm9HcyA8LSBnZ3NlcWxvZ28obGlzdC5tcm5hLm5vR3MsIG5jb2wgPSBuY29sLCBtZXRob2Q9bWV0aG9kKQpnZ3NsLm1ybmEgPC0gZ2dzZXFsb2dvKGxpc3QubXJuYSwgbmNvbCA9IG5jb2wsIG1ldGhvZD1tZXRob2QpCgoKcGxvdF9ncmlkKHBsb3RfZ3JpZChjcml0aWNhbFBsb3RUaXRsZSwgbm9uQ3JpdGljYWxQbG90VGl0bGUsIG5jb2w9MiksIHBsb3RfZ3JpZChnZ3NsLm1ybmEsIGdnc2wubXJuYS5ub0dzLCBuY29sPTIpLCByZWxfaGVpZ2h0cyA9IGMoMC4xLDEwKSwgbmNvbD0xKQoKCmBgYAoKCiMjIyBOb24gQ29kaW5nIFJOQQoKYGBge3IgbG9nby5mb3Iuc3BlY2lmaWMudGV0cmEubmNybmEsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD0xMCwgZWNobz1GfQpyZXF1aXJlKGdncGxvdDIpCnJlcXVpcmUoZ2dzZXFsb2dvKQpnZ3NsLm5jcm5hIDwtIGdnc2VxbG9nbyggYyhzcGVjaWZpYy5tYXRjaGVzLm5jcm5hLCBsaXN0KHVuc3BlY2lmaWMubWF0Y2hlcy5uY3JuYSkpLCBuY29sID0gbmNvbCwgbWV0aG9kPW1ldGhvZCkKCgpzZXBjaWZpYy5tcm5hLm5jcm5hLmxpc3QgPC0gKGMoc3BlY2lmaWMubWF0Y2hlcy5tcm5hW1tuY3JuYV1dKSkKc3ViLm1ybmEubmNybmEubGVmdCA8LSB1bmxpc3Qoc2VwY2lmaWMubXJuYS5uY3JuYS5saXN0KQpzdWIubXJuYS5uY3JuYS5sZWZ0IDwtIHN1YnN0cmluZyhzdWIubXJuYS5uY3JuYS5sZWZ0LCBmaXJzdCA9IDEsIGxhc3Q9MTQpCnN1Yi5tcm5hLm5jcm5hLnJpZ2h0IDwtIHVubGlzdChzZXBjaWZpYy5tcm5hLm5jcm5hLmxpc3QpCnN1Yi5tcm5hLm5jcm5hLnJpZ2h0IDwtIHN1YnN0cmluZyhzdWIubXJuYS5uY3JuYS5yaWdodCwgZmlyc3QgPSBuY2hhcihzdWIubXJuYS5uY3JuYS5yaWdodCktMTMsIGxhc3Q9bmNoYXIoc3ViLm1ybmEubmNybmEucmlnaHQpKQpzdWIubXJuYS5uY3JuYS51bnNwZWNpZmljIDwtICB1bnNwZWNpZmljLm1hdGNoZXMubXJuYVtbbmNybmFdXQoKc3ViLm1ybmEubmNybmEubGVmdCA8LSBsaXN0KHN1Yi5tcm5hLm5jcm5hLmxlZnQpCm5hbWVzKHN1Yi5tcm5hLm5jcm5hLmxlZnQpIDwtICJNb3RpZiBVcHN0cmVhbSIKc3ViLm1ybmEubmNybmEucmlnaHQgPC0gbGlzdChzdWIubXJuYS5uY3JuYS5yaWdodCkKbmFtZXMoc3ViLm1ybmEubmNybmEucmlnaHQpIDwtICJNb3RpZiBEb3duc3RyZWFtIgpzdWIubXJuYS5uY3JuYS51bnNwZWNpZmljIDwtIGxpc3Qoc3ViLm1ybmEubmNybmEudW5zcGVjaWZpYykKbmFtZXMoc3ViLm1ybmEubmNybmEudW5zcGVjaWZpYykgPC0gIlVuc3BlY2lmaWMgVGV0cmFudWNsZW90aWRlIChUQ0NDIG9yIENDQ0MpIFVwLSBhbmQgRG93bnN0cmVhbSIKCmdnc2wubXJuYS5uY3JuYS5sZWZ0IDwtIGdnc2VxbG9nbyhzdWIubXJuYS5uY3JuYS5sZWZ0LCBuY29sID0gbmNvbCwgbWV0aG9kPW1ldGhvZCkKZ2dzbC5tcm5hLm5jcm5hLnJpZ2h0IDwtIGdnc2VxbG9nbyhzdWIubXJuYS5uY3JuYS5yaWdodCwgbmNvbCA9IG5jb2wsIG1ldGhvZD1tZXRob2QpCmdnc2wubXJuYS5uY3JuYS51bnNwZWNpZmljIDwtIGdnc2VxbG9nbyhzdWIubXJuYS5uY3JuYS51bnNwZWNpZmljLCBuY29sID0gbmNvbCwgbWV0aG9kPW1ldGhvZCkKcGxvdF9ncmlkKHBsb3RfZ3JpZChwbG90X2dyaWQoY3JpdGljYWxQbG90VGl0bGUsIGdnc2wubXJuYS5uY3JuYS5sZWZ0LCByZWxfaGVpZ2h0cyA9IGMoMSwxMCksbmNvbD0xKSwgcGxvdF9ncmlkKG5vbkNyaXRpY2FsUGxvdFRpdGxlLCBnZ3NsLm1ybmEubmNybmEucmlnaHQscmVsX2hlaWdodHMgPSBjKDEsMTApLCBuY29sPTEpLG5jb2w9MiksIHBsb3RfZ3JpZChnZ3NsLm1ybmEubmNybmEudW5zcGVjaWZpYyksIG5jb2w9MSkKCmBgYAoKCmBgYHtyIGxvZ28uZm9yLnNwZWNpZmljLnRldHJhLm5jcm5hLm5vR3MsIGZpZy53aWR0aD0yMCwgZmlnLmhlaWdodD0xMCwgZWNobz1GfQpyZXF1aXJlKGdncGxvdDIpCnJlcXVpcmUoZ2dzZXFsb2dvKQpnZ3NsLm5jcm5hIDwtIGdnc2VxbG9nbyggYyhzcGVjaWZpYy5tYXRjaGVzLm5jcm5hLCBsaXN0KHVuc3BlY2lmaWMubWF0Y2hlcy5uY3JuYSkpLCBuY29sID0gbmNvbCwgbWV0aG9kPW1ldGhvZCkKZ2dzbC5uY3JuYQoKCnNlcGNpZmljLm1ybmEubmNybmEubm9Hcy5saXN0IDwtIChjKHNwZWNpZmljLm1hdGNoZXMubXJuYVtbbmNybmFdXSkpCnN1Yi5tcm5hLm5jcm5hLm5vR3MubGVmdCA8LSB1bmxpc3Qoc2VwY2lmaWMubXJuYS5uY3JuYS5ub0dzLmxpc3QpCnN1Yi5tcm5hLm5jcm5hLm5vR3MubGVmdCA8LSBzdWJzdHJpbmcoc3ViLm1ybmEubmNybmEubm9Hcy5sZWZ0LCBmaXJzdCA9IDEsIGxhc3Q9MTQpCnN1Yi5tcm5hLm5jcm5hLm5vR3MucmlnaHQgPC0gdW5saXN0KHNlcGNpZmljLm1ybmEubmNybmEubm9Hcy5saXN0KQpzdWIubXJuYS5uY3JuYS5ub0dzLnJpZ2h0IDwtIHN1YnN0cmluZyhzdWIubXJuYS5uY3JuYS5ub0dzLnJpZ2h0LCBmaXJzdCA9IG5jaGFyKHN1Yi5tcm5hLm5jcm5hLm5vR3MucmlnaHQpLTEzLCBsYXN0PW5jaGFyKHN1Yi5tcm5hLm5jcm5hLm5vR3MucmlnaHQpKQpzdWIubXJuYS5uY3JuYS5ub0dzLnVuc3BlY2lmaWMgPC0gIHVuc3BlY2lmaWMubWF0Y2hlcy5tcm5hW1tuY3JuYV1dCgpzdWIubXJuYS5uY3JuYS5ub0dzLmxlZnQgPC0gbGlzdChzdWIubXJuYS5uY3JuYS5ub0dzLmxlZnQpCm5hbWVzKHN1Yi5tcm5hLm5jcm5hLm5vR3MubGVmdCkgPC0gIk1vdGlmIFVwc3RyZWFtIgpzdWIubXJuYS5uY3JuYS5ub0dzLnJpZ2h0IDwtIGxpc3Qoc3ViLm1ybmEubmNybmEubm9Hcy5yaWdodCkKbmFtZXMoc3ViLm1ybmEubmNybmEubm9Hcy5yaWdodCkgPC0gIk1vdGlmIERvd25zdHJlYW0iCnN1Yi5tcm5hLm5jcm5hLm5vR3MudW5zcGVjaWZpYyA8LSBsaXN0KHN1Yi5tcm5hLm5jcm5hLm5vR3MudW5zcGVjaWZpYykKbmFtZXMoc3ViLm1ybmEubmNybmEubm9Hcy51bnNwZWNpZmljKSA8LSAiVW5zcGVjaWZpYyBUZXRyYW51Y2xlb3RpZGUgKFRDQ0Mgb3IgQ0NDQykgVXAtIGFuZCBEb3duc3RyZWFtIgoKZ2dzbC5tcm5hLm5jcm5hLm5vR3MubGVmdCA8LSBnZ3NlcWxvZ28oc3ViLm1ybmEubmNybmEubm9Hcy5sZWZ0LCBuY29sID0gbmNvbCwgbWV0aG9kPW1ldGhvZCkKZ2dzbC5tcm5hLm5jcm5hLm5vR3MucmlnaHQgPC0gZ2dzZXFsb2dvKHN1Yi5tcm5hLm5jcm5hLm5vR3MucmlnaHQsIG5jb2wgPSBuY29sLCBtZXRob2Q9bWV0aG9kKQpnZ3NsLm1ybmEubmNybmEubm9Hcy51bnNwZWNpZmljIDwtIGdnc2VxbG9nbyhzdWIubXJuYS5uY3JuYS5ub0dzLnVuc3BlY2lmaWMsIG5jb2wgPSBuY29sLCBtZXRob2Q9bWV0aG9kKQoKcGxvdF9ncmlkKHBsb3RfZ3JpZChwbG90X2dyaWQoZ2dzbC5tcm5hLm5jcm5hLmxlZnQsIGdnc2wubXJuYS5uY3JuYS5yaWdodCxuY29sPTIpLCBwbG90X2dyaWQoZ2dzbC5tcm5hLm5jcm5hLnVuc3BlY2lmaWMpLCBuY29sPTEpLApwbG90X2dyaWQocGxvdF9ncmlkKGdnc2wubXJuYS5uY3JuYS5ub0dzLmxlZnQsIGdnc2wubXJuYS5uY3JuYS5ub0dzLnJpZ2h0LG5jb2w9MiksIHBsb3RfZ3JpZChnZ3NsLm1ybmEubmNybmEubm9Hcy51bnNwZWNpZmljKSwgbmNvbD0xKSwgbmNvbD0yKQoKYGBgCgoKYGBge3IgZWNobz1GfQojIyB7LnRhYnNldCAudGFic2V0LWZhZGUgfQojPGg1IGlkPSJMb2dvc1JlZ3VsYXRvcnkiPjxhIGhyZWY9IiNiYWNrIj41LjIgUmVndWxhdG9yeTwvYT48L2g0PgojIyB7LnRhYnNldCAudGFic2V0LWZhZGUgfQoKIzxoNSBpZD0iTG9nb3NSZWd1bGF0b3J5Ij48YSBocmVmPSIjYmFjayI+NS4yIFJlZ3VsYXRvcnk8L2E+PC9oND4KCiNUbyBiZSBjb250aW51ZWQuCmBgYAoKCiMjIHsudGFic2V0IC50YWJzZXQtZmFkZSB9CgojIyMgU2Vzc2lvbiBJbmZvCmBgYHtyIGVjaG89Rn0Kc2Vzc2lvbkluZm8oKQpgYGAKCgoKCgo=